SSHを介してリモートで実行されたコマンドの出力を変数に保存すると、ブロックされます。接続が終了していませんか?

SSHを介してリモートで実行されたコマンドの出力を変数に保存すると、ブロックされます。接続が終了していませんか?

何が問題なのかよく分からない。現在、新しくインストールされたKali Linux 2.0を使用しています。以下はUbuntu 14.04で動作しましたが、もう機能しません(誤って変更した可能性がありますか?)。私にとっては正しいように見えますが、実行されるたびにブロックされます。

backup_folder=$(ssh -i /home/dexter/.ssh/id_rsa $server 'ls -t '$dir' | head -1')

これは大きなスクリプトの一部です。 $ serverと$dirが設定されました。コマンドを単独で実行すると、正しい出力が出ますが、接続は終了しません。

答え1

コマンドが中断される理由は完全にはわかりませんが、サーバーでパイプライン全体を実行する必要はありません。そこからすれば十分ですls

backup_folder=$( ssh -i keyfile "$server" "ls -t -- '$dir'" | head -n 1 )

これは$dirリモート側の値を表します(まだローカルに拡張されます)。これはheadローカルで実行されます。

これには、「に対する回答に記載されている警告が付属しています。なぜ`ls`を解析しないのですか*(そしてどうすればいいですか?)」。

答え2

私も同じ問題があり、 man ssh を参照して以下を見つけました。

# Problem: if you copy & paste those two lines together into a shell, 
# then the second command is not executed. 
# But if you run each line on its own, it will work
srcdirs=$(ssh myserver "ls -1 /home")
echo "$srcdirs"   # command is also not recorded by history

# Solution: Redirect stdin from /dev/null
srcdirs=$(ssh -n myserver "ls -1 /home")
echo "$srcdirs"

これがあなたの問題を解決することを願っています...

答え3

最近同じ問題が発生しました。おそらく、次のようにコマンドの最後にstdoutのリダイレクトを追加する必要があります。

backup_folder=$(ssh -i /home/dexter/.ssh/id_rsa $server 'ls -t '$dir' | head -1' 2>&1)

関連情報