回答:
もう1つの方法は、-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.
ssh -t localhost <<< "sudo touch file;"
EDITどうやら、コマンドをパラメーターとして提供することが重要です。これは、標準入力(後から考えると意味があります)ではありません。
-t
メソッドは、通常そうするコマンドのカラー出力も表示します。
次のコマンドで完全に自動化できました。
echo pass | ssh -tt user@server "sudo script"
利点:
セキュリティについて:としてクルトは言った、このコマンドを実行すると、ローカルのbashの歴史上のパスワードを示し、それは別のファイルにパスワードを保存するか.SHファイル内のすべてのコマンドを保存し、それを実行する方が良いでしょうします。注:許可されたユーザーのみがファイルにアクセスできるように、ファイルには正しい権限が必要です。
-t
ていましたが、マニュアルを十分に読んでいなかったため、2回渡せることを確認できませんでした。これは私が何ヶ月も探していたものです!セキュリティの追加として、で実行する前に単にパスワード変数を設定してから、を設定read -s -p "Password: " pw
しましたecho "$pw" | ....
。これを自分用の便利なスクリプトにまとめました:)。
パスワードプロンプトが必要ない場合:
ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'
例
ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'
パスワードを渡すSSH上のsudo、ttyは不要:
sudoにsshを強制的に使用せずに(sshの "-t"スイッチを使用せずに)sudoでsudoを使用して、対話型パスワードを要求せず、標準入力からパスワードを取得するようにsudoに指示することができます。これを行うには、sudoで「-S」スイッチを使用します。これにより、sudoはstdinでパスワードをリッスンし、改行が検出されたときにリッスンを停止します。
例1-単純なリモートコマンド
この例では、簡単なwhoami
コマンドを送信します。
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
プロンプトを出さずに、標準入力から入力を受け取るようにsudoに指示しています。これにより、sudoパスワードの通過が完全にサイレントになるため、返される唯一の応答はからの出力ですwhoami
。
この手法には、標準入力を必要とするsshを介してsudoを介してプログラムを実行できるという利点があります。これは、sudoがstdinの最初の行でパスワードを使用しているため、実行するすべてのプログラムにstdinを引き続き取得させるためです。
例2-独自のstdinを必要とするリモートコマンド
次の例では、リモートコマンド「cat」がsudoを介して実行され、リモートのcatを表示するために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
、コマンドラインの構成によって、入力したすべてのものが(パスワードを含めて)ローカルマシンの.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
スクリプトの内容を履歴に残さないため、スクリプトにすべてを入れる場合は、パスワードを別のファイルに入れる必要はありません。ただし、パスワードを表示してはいけないユーザーにスクリプトの実行を許可する場合は、この方法が役立つ場合があります。
cat
、結果を実行してsudoにパイプする必要があるのはなぜですか?sudo
メインのsshリモートコマンドとして使用できますか?
cat
は、反対側のsudoにユーザーのパスワードをパイプするために使用されます。ユーザーがパスワードなしでsudoを実行できる場合、それは必須ではありませんが、この構成はお勧めしません。パイプされるのは、リモートシステムのコマンドラインにパスワードが表示されないようにするためです。コマンドラインは安全ではなく、すべてのユーザーがですべてのコマンドラインを見ることができますps auxwww
。
cat
sshコマンドでを要求していますcat \| sudo --prompt="" -S...
。-S
強制的sudo
に標準入力からパスワードを読み取る場合、猫とパイプはまったく必要ですか?sshコマンドは単にsudo --prompt="" -S...
でしょうか?
NOPASS
ターゲットマシンの構成でのソリューションです。続きを読むhttp://maestric.com/doc/unix/ubuntu_sudo_without_password
echo $VAR_REMOTEROOTPASS | ssh -tt -i $PATH_TO_KEY/id_mykey $VAR_REMOTEUSER@$varRemoteHost
echo \"$varCommand\" | sudo bash
私は問題に直面しました、
user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt
Output:
sudo: no tty present and no askpass program specified
それから私は試してみました
#1
vim /etc/sudoers
Defaults:user1 !requiretty
うまくいきませんでした
#2
user1 ALL=(user2) NOPASSWD: ALL
それは正しく機能しました!
あなたの使い方にもよりますが、私は次のことで成功しました:
ssh root@server "script"
これにより、rootパスワードの入力が求められ、コマンドが正しく実行されます。
ssh <user@server> sudo <script>
は、エラーが発生したため、のようなものを試行したときに機能しなかったためですsudo: no tty present and no askpass program specified