0

ローカル マシンから実行できるシェル スクリプトを使用して、展開プロセスを自動化しようとしています。プロセスは簡単です。

  1. リモートサーバーへの SSH
  2. git pull指定された引数に応じてコマンドを実行します

現在、私はこれを持っています:

#!/bin/sh

SSH_HOST="REMOVED"
SSH_PORT="REMOVED"
SSH_USER="REMOVE"

if [ "$1" = "live" ]
    then
    DIR="REMOVED"
    GIT_BRANCH="REMOVED"
    echo "Deploying to live site..."
elif [ "$1" = "test" ]
    then
    DIR="REMOVED"
    GIT_BRANCH="REMOVED"
    echo "Deploying to test site..."
else
    echo "ERROR: Please specify a target (either live or test)"
    exit 1;
fi

# create SSH connection
echo "ssh $SSH_USER@$SSH_HOST -p $SSH_PORT"
ssh $SSH_USER@$SSH_HOST -p $SSH_PORT << END_SSH
sudo -s
cd $DIR
git pull origin $GIT_BRANCH
END_SSH

echo "Site successfully deployed."
exit 0;

しかし、スクリプトを実行すると、次のメッセージが表示されます。

stdin は端末ではないため、疑似端末は割り当てられません。
sudo: 申し訳ありませんが、sudo を実行するには tty が必要です
エラー: .git/FETCH_HEAD を開けません: 許可が拒否されました

どこで間違ったのですか?最後の行は、リモート サーバーで sudo として認証できなかったため、パーミッション エラーのために Git コマンドを実行できなかっただけですが、最初の 2 行の原因は何ですか? 何かを誤って設定したのでしょうか、それともどこかで構文エラーがありますか?

4

2 に答える 2

1

sshここでパスワードを要求しています:

ssh $SSH_USER@$SSH_HOST -p $SSH_PORT << END_SSH

しかし、stdinはターミナル(tty)からではなく、ヒアドキュメントから来ています。そのため、標準のtty互換のパスワード要求メカニズムを使用することはできません。

リモートマシンが公開鍵で構成されている場合は、これを回避できる可能性があります。別のオプションは、オプションを調査することです-t(これにより、疑似ttyの割り当てが強制されます)

于 2013-01-10T10:38:49.287 に答える
0

stdin は端末ではないため、疑似端末は割り当てられません。

で stdin をリダイレクトしたため、これは正常な動作です<<

sudo: 申し訳ありませんが、sudo を実行するには tty が必要です

sudoこれは、実際のユーザーが対話型端末に座っていることを望んでいるため、以前の動作の直接的な結果です。

インタラクティブなセッションは本当に必要ないと思います。実際にコマンドを実行したいユーザーとしてsshを実行し、シェルコマンドをパラメーターとしてsshを呼び出すか、サーバー上にスクリプトを作成してから実行するだけです非対話的な ssh 呼び出し。

于 2013-01-10T10:39:58.717 に答える