web-dev-qa-db-ja.com

sshを介したSudoの適切な方法

Sudoを使用して、リモートサーバーでSSH経由で別のスクリプトを実行するスクリプトがあります。ただし、パスワードを入力すると、端末に表示されます。 (それ以外は正常に動作します)

ssh user@server "Sudo script"

これを行うための適切な方法は何ですか?それで、入力時にパスワードが表示されずにSudo over SSHのパスワードを入力できますか?

125
darkfeline

別の方法は、-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.
210
dave4420

次のコマンドで完全に自動化できました。

echo pass | ssh -tt user@server "Sudo script"

利点:

  • パスワードなしのプロンプト
  • リモートマシンのbash履歴にパスワードを表示しません
10
ofirule

パスワードプロンプトが必要ない場合

ssh $Host 'echo $PASSWORD | Sudo -S $COMMMAND'

ssh me@localhost 'echo secret | Sudo -S echo hi' # outputs 'hi'
6
Leathan

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

スクリプトにすべてを入れる場合は、スクリプトの内容が履歴に記録されないため、別のファイルにパスワードを入れる必要はありません。ただし、パスワードを表示してはならないユーザーにスクリプトの実行を許可する場合は、依然として便利です。

2
Kurt Fitzner

ターゲットマシンの構成のNOPASSが解決策です。 http://maestric.com/doc/unix/ubuntu_Sudo_without_password で読み続けます

0
Raphael Bossek

最適な方法はssh -t user@server "Sudo <scriptname>"です(例:ssh -t user@server "Sudo reboot")。最初にユーザーのパスワードを要求し、次にrootを要求します(スクリプトまたはコマンドをroot権限で実行しているためです)。

私はそれがあなたの疑いを助け、クリアしたことを願っています。

0
kashyap