このコマンドを実行すると、期待どおりに出力され、マイ/root
サーバーのディレクトリが一覧表示されます。
~ bash -c "ssh -t myserver 'sudo ls /root'"
Enter passphrase for key '/home/james/.ssh/ed25519':
[sudo] password for myserver:
snap
Connection to 167.172.xxx.xxx closed.
ただし、サブシェルを使用してその出力を変数にインポートしようとすると、SSHパスワードを入力した後にSSHセッションが中断されます。
➜ ~ var=$(bash -c "ssh -t myserver 'sudo ls /root'")
Enter passphrase for key '/home/james/.ssh/ed25519':
そのまま残ります。もう一度Enterを押しても新しい行は生成されず、ctrl-Cでキャンセルされるまで何も起こりません。
サブシェルで動作が異なるのはなぜですか。sshコマンドの出力をローカル変数にインポートするにはどうすればよいですか?
編集:@KamilMaciorowskiが指摘したように、stderrとstdoutは1つにマージされます。 (実際にはパスワードを入力できます。キャプチャされた出力にはパスワードプロンプトと予想される出力が含まれます。)
var=$(bash -c "ssh -t stash 'sudo ls /root'")
Connection to 167.172.xxx.xxx closed.
➜ ~ echo $var
[sudo] password for stash:
snap
彼がリンクしたスレッドは私が望むことが不可能であることを示すようだったので、出力文字列を操作するのが最善の選択であると思ってうまくいきました。
var=$(bash -c "ssh -t stash 'sudo ls /root'" | tail -n +2)
しかし、リモートコマンドの出力をローカル変数としてキャプチャするより良い方法はありますか?