複数サーバの連携をしたいんで、シェルスクリプトの内部から ssh でリモートのスクリプトを実行しようとしてたんだけど、以下のワーニング(?)が出てしまっていたのでメモ。
Pseudo-terminal will not be allocated because stdin is not a terminal.
ちなみにスクリプトとしてはこんな感じ。
#!/bin/sh
ssh hoge <<EOF
fuga.sh
exit
EOF
とりあえずググってみると、以下のようなエントリが。
多段 ssh / rsync するために ProxyCommand を使ってみる
引用させていただくと、
メッセージにかかれているとおり,仮想端末(pty)がアロケートされていないのでプロンプトや行バッファなどの機能が無効になっているのです。
原因と対策については sshで多段ログイン - 技術メモ帳 に記述がありますが,-t を指定すればよいです。
なるほど。Pseudo-terminalって見慣れないワードだけど、擬似端末って意味だったようだ。
ただスクリプト内からの ssh 実行だと、 -t オプションを付けてもワーニングが消えない。
で、 man をよく読んでみると以下の記載が。
-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.
というわけで、なんか不恰好だけど -t オプションを2個つけて無事解決した。
#!/bin/sh
ssh -t -t hoge <<EOF
fuga.sh
exit
EOF