1. ホーム
  2. スクリプト・コラム
  3. リモートスクリプト

[解決済み】stdinがターミナルではないため、擬似ターミナルが割り当てられない

2022-01-09 22:24:51

質問

リモートサーバーにディレクトリを作成し、ローカルファイルをリモートサーバーにscpする機能を実装する必要がありますが、私はこれを行うためにシェルスクリプトを使用しています、コードは次のとおりです。

ssh -t user@server<<EOT
DEP_ROOT='/home/matthewr/releases'
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR=$DEP_ROOT"/"$datestamp
if [ ! -d "$DEP_ROOT" ]; then
    echo "creating the root directory"
    mkdir $DEP_ROOT
fi
mkdir $REL_DIR
exit
EOT

scp ./dir1 user@server:$REL_DIR
scp ./dir2 user@server:$REL_DIR

スクリプトを実行すると、エラーが発生しました。

Pseudo-terminal will not be allocated because stdin is not a terminal.

そして、スクリプトは永遠にハングアップするだけです。

私の公開鍵はサーバー上で信頼されており、スクリプトの外ですべてのコマンドを問題なく実行することができます。 

どのように解決するのですか?

試す ssh -t -t (または ssh -tt を使うことで、stdin がターミナルでない場合でも擬似的に tty を確保することができます。

こちらもご覧ください。 bashスクリプトで実行されたSSHセッションを終了させる

sshのmanpageより。

-T      Disable pseudo-tty allocation.

-t      Force pseudo-tty allocation.  This can be used to execute arbitrary 
        screen-based programs on a remote machine, which can be very useful,
        e.g. when implementing menu services.  Multiple -t options force tty
        allocation, even if ssh has no local tty.