1. ホーム
  2. linux

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

2022-01-30 02:33:20

質問

私は、リモートサーバー上にいくつかのディレクトリを作成し、その後、私のローカルマシンからリモート上にファイルをコピーするために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.