1. ホーム
  2. linux

[解決済み] stdinはターミナルではないので、疑似ターミナルは割り当てられません。

2022-03-08 16:02:14

質問

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