sshコマンドでsudoを使用して標準出力をキャプチャする

sshコマンドでsudoを使用して標準出力をキャプチャする

リモートサーバーからrootとしてコマンドを実行し(sudoを介して)、標準出力(標準エラーではない)をファイルにキャプチャしようとしています。

例えば。このような:

ssh user@remote "cat /root/file.tar | gzip" > root-file.tar.gz

リモートでルートアクセスが必要ない場合:

ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz

パスワードがないと、rootとしてログインできないため、suまたはを使用できませんssh root@server

上記のコマンドを実行すると、次のような結果が表示されます。

$ ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
sudo: no tty present and no askpass program specified

ttyを割り当てるためにsshを追加し、-tsudo root-file.tar.gz(およびgzipですが--forceも可能です)から出力を取得するので、リモートのstdoutとstderrをローカルのstdoutとしてキャプチャするようです。

$ ssh -t user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
(hangs)

$ cat root-file.tar.gz
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
[sudo] password for user:

私はsudoerでNOPASSWDを使って特定のコマンドをホワイトリストに追加しています。これは定期的に表示されるスクリプトには適していますが、時々他の任意のコマンドでこのようなことをしたいので、永久にNOPASSWDを追加することはできません。 。

答え1

-Sオプション[0]をsudoに渡すことで、ttyを要求せずにstdinでパスワードを受け入れることができます。

これによりパスワードが端末にエコーされる可能性があるため、直接エコーをオフにしてください。

$ stty -echo; ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
[sudo] password for user:
$

[0]からマンページ:-S(stdin)オプションを使用すると、sudoは端末デバイスの代わりに標準入力からパスワードを読み込みます。パスワードの後に​​は改行文字が続きます。

関連情報