Sudoを使用して、リモートサーバーでSSH経由で別のスクリプトを実行するスクリプトがあります。ただし、パスワードを入力すると、端末に表示されます。 (それ以外は正常に動作します)
ssh user@server "Sudo script"
これを行うための適切な方法は何ですか?それで、入力時にパスワードが表示されずにSudo over SSHのパスワードを入力できますか?
別の方法は、-t
スイッチをssh
に使用することです。
ssh -t user@server "Sudo script"
man ssh
を参照してください:
-t Force pseudo-tty allocation. This can be used to execute arbi-
trary 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.
次のコマンドで完全に自動化できました。
echo pass | ssh -tt user@server "Sudo script"
利点:
パスワードプロンプトが必要ない場合:
ssh $Host 'echo $PASSWORD | Sudo -S $COMMMAND'
例
ssh me@localhost 'echo secret | Sudo -S echo hi' # outputs 'hi'
Sudo over SSH over password、no tty required:
Sudoに対話型パスワードを要求せず、標準入力からパスワードを取得するように指示することにより、sshに疑似ttyを強制せずに(ssh "-t"スイッチを使用せずに)ssh経由でSudoを使用できます。これを行うには、Sudoで「-S」スイッチを使用します。これにより、Sudoはstdinでパスワードをリッスンし、改行を検出するとリッスンを停止します。
例1-簡単なリモートコマンド
この例では、単純なwhoami
コマンドを送信します。
$ ssh user@server cat \| Sudo --Prompt="" -S -- whoami << EOF
> <remote_Sudo_password>
root
Sudoに対して、プロンプトを発行せず、その入力をstdinから取得するように指示しています。これにより、Sudoパスワードが完全にサイレントに渡されるため、返される応答はwhoami
からの出力のみです。
この手法には、標準入力を必要とするssh経由でSudoを介してプログラムを実行できるという利点があります。これは、sudoがstdinの最初の行でパスワードを消費し、実行するプログラムが引き続きstdinを取得できるようにするためです。
例2-独自のstdinを必要とするリモートコマンド
次の例では、リモートコマンド「cat」がSudoを介して実行され、リモートの猫が表示するために、stdinを介していくつかの追加の行を提供しています。
$ ssh user@server cat \| Sudo --Prompt="" -S -- "cat" << EOF
> <remote_Sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
出力は、<remote_Sudo_password>
行がSudoによって消費されており、リモートで実行されたcatが余分な行を表示していることを示しています。
これが有益な例は、コマンドラインを使用せずにsshを使用して特権コマンドにパスワードを渡す場合です。 ssh経由でリモートの暗号化されたコンテナをマウントする場合は、言います。
例3-リモートVeraCryptコンテナーのマウント
このスクリプト例では、追加のプロンプトテキストなしで、Sudoを介してVeraCryptコンテナをリモートでマウントしています。
#!/bin/sh
ssh user@server cat \| Sudo --Prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF
上記のすべてのコマンドラインの例(スクリプトを除くすべて)で、コマンドラインの<< EOF
コンストラクトにより、パスワードを含む入力したすべてのものがに記録されることに注意してくださいlocalマシンの.bash_history。したがって、実際の使用では、上記のveracryptの例のように、スクリプトを使用して完全に実行するか、コマンドラインでパスワードをファイルに入れてsshでそのファイルをリダイレクトすることを強くお勧めします。
例1a-ローカルコマンドラインパスワードを使用しない例1
したがって、最初の例は次のようになります。
$ cat text_file_with_Sudo_password | ssh user@server cat \| Sudo --Prompt="" -S -- whoami
root
例2a-ローカルコマンドラインパスワードを使用しない例2
2番目の例は次のようになります。
$ cat text_file_with_Sudo_password - << EOF | ssh va1der.net cat \| Sudo --Prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
スクリプトにすべてを入れる場合は、スクリプトの内容が履歴に記録されないため、別のファイルにパスワードを入れる必要はありません。ただし、パスワードを表示してはならないユーザーにスクリプトの実行を許可する場合は、依然として便利です。
ターゲットマシンの構成のNOPASS
が解決策です。 http://maestric.com/doc/unix/ubuntu_Sudo_without_password で読み続けます
最適な方法はssh -t user@server "Sudo <scriptname>"
です(例:ssh -t user@server "Sudo reboot"
)。最初にユーザーのパスワードを要求し、次にrootを要求します(スクリプトまたはコマンドをroot権限で実行しているためです)。
私はそれがあなたの疑いを助け、クリアしたことを願っています。