ローカルコンピュータで実行されるbashスクリプトによって、リモートサーバー上でコマンド(sudo権限付き)を実行します。

ローカルコンピュータで実行されるbashスクリプトによって、リモートサーバー上でコマンド(sudo権限付き)を実行します。

ローカルコンピュータからリモートシステムでコマンドを実行する

シェルを開かずに、SSH 接続でリモート lubuntu 22.04 システムでコマンドを実行する必要があります。この命令はスクリプト内で実行されます。このスクリプトは、ローカル システム (別の Ubuntu ディストリビューションがインストールされている) で実行されます。ローカル システムで次のスクリプトを実行すると、正常に実行できることがわかりました。

# define a variable which stored the password
MYPASSWORD='mypassword'

sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"

私が使用したコマンド(ローカル システムにインストールされています)では、SSH セッションの認証に必要なsshpassユーザーのパスワードの入力を回避しています。myuser

私のニーズ

前と同じようにコマンドを実行する必要がありますcpが、ファイルの保存先はサブフォルダーなので/etcsudo権限が必要です。したがって、スクリプトは次のようになります。

MYPASSWORD='mypassword'

sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"

sshpass -p $MYPASSWORD ssh [email protected] "sudo -S cp /home/myuser/file1 /etc/sub/folder/"

スクリプトを実行すると、スクリプトの最後のコマンドによって次の要求が出力されます。

[sudo] password for myuser:

したがって、スクリプトは実行を停止し、sudoパスワードを待機します。
そんなの欲しくないよ!

私の試み

次のコマンドを実行すると:

> echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/

直接リモートシステムの端末でパスワードを尋ねることなく動作し、コピーされfile1ます。/etc/sub/folder/sudo

しかし、次のコマンドを実行すると私のローカルシステム上:

sshpass -p 'mypassword' ssh [email protected] "echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/"

動作しません!

私の質問

キーボードによるパスワード入力を回避する方法はありますかsudo?パスワードを自動送信することは可能ですか?

答え1

回避策/解決策を見つけました。

パスワードを一時的に保存するファイルを使用するsudo

以下に示すいくつかのコマンドを追加して、ローカル システムで実行されるスクリプトを変更しました。

  • コマンドによってリモート システムのフォルダーにテキスト ファイルが作成されますecho。このファイルは と呼ばれ、ユーザー のpassword.txtパスワード ( ) のみが含まれます。"mypassword"myuser
  • ファイルはオペレータによるコマンドpassword.txtへの直接入力です。sudo<
  • コマンドの実行sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/
  • リモートシステムからファイル /home/myuser/password.txt を削除する

このソリューションは安全な開発環境で使用されるため、セキュリティ制約に違反することはありません。

新しい脚本

この指示により、ローカル システムで実行されるスクリプトは次のようになります。

MYPASSWORD='mypassword'

# creation of the file password.txt on the home folder of the remote system
sshpass -p $MYPASSWORD ssh [email protected] "echo $MYPASSWORD > /home/myuser/password.txt"

# execution of the command which needs the sudo privileges (on remote system)
sshpass -p $MYPASSWORD ssh [email protected] "sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/"
# The '<' directs file passowrd.txt as input to sudo   ===========================

# deletion of the file password.txt
sshpass -p $MYPASSWORD ssh [email protected] rm /home/myuser/password.txt

出力を抑制するsudo -S

私は、SSH からローカル システムに送信される[sudo] password for myuser:コマンドの出力 ( ) を抑制できる別の改善点を見つけました。以下に示すように、演算子とデバイス を使用するだけで十分です。sudo -S
&>/dev/null

sshpass -p $MYPASSWORD ssh [email protected] "sudo -S \
  < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/" &> /dev/null

注記私のローカル システムでは、出力の抑制は[sudo] password for myuser:次のリダイレクトによって機能します。

  • &>/dev/null
  • >&/dev/null

これは、前の演算子が同等であるため正常です(この郵便受けSuperUser でご覧ください。

抑圧動作しません次のリダイレクトによって:

  • >/dev/null

関連情報