オープンSSH接続を介して複数のsudoコマンドを実行する方法

オープンSSH接続を介して複数のsudoコマンドを実行する方法

SSHを使用して、「USER1」サーバーから「USER2」ユーザーとして別のサーバーに移動しようとしています。

ssh -t $hostname "sudo su - USER2; whoami; pwd"

上記のコマンドを実行した後、USER2にサーバーに正常に移動できましたが、次のコマンド(「whoamiとpwd」など)は実行されませんでした。ただし、sshセッションを終了すると、出力にUSER1が表示され、その後に現在の作業ディレクトリが表示されます。

SSH 既知のホストファイルを変更したくありません。

ベストアンサー1

sudo su - USER2; whoami; pwdリモートホストでコマンドを実行しています。分析してみましょう。

  • セミコロンで区切られたコマンドは順次実行されます。したがって、コマンドがsudo su - USER2最初に実行され、次に完了すると実行され、whoami最後にpwd実行されます。
  • このコマンドは、sudo su - USER2ユーザー USER2 でログイン・シェルを開始します。シェルは、終了を求めるコマンドを受け取るまで(組み込みを使用するなどexit)、または標準入力からファイルの終わりを検出するまで、標準入力からコマンドを読み取ります。標準入力は端末に接続されているため、ユーザーがコマンドを入力するのを待ちます。

USER2でコマンドを実行するには、そのコマンドを引数として渡す必要がありますsudosuここでの実行は役に立ちません。 sudoはこれを行う方法を既に知っています。-tリモートコマンド(Sudoパスワード入力を含む)と対話したい場合を除き、SSHオプションは必要ありません。

ssh -t "$remotehost" 'sudo -i -u USER2 sh -c "whoami; pwd"'

sudo 構成が任意のユーザーではなく root でのみプログラムを実行できるようにする場合 (セキュリティーについては何も変更されません)sudo suこの場合、-cオプションをsu指定されたシェル・コマンドの実行に渡す必要があります。 。

ssh -t "$remotehost" 'sudo su -c "whoami; pwd" USER2'

ユーザーの読書が必要な場合は、.profile明示的に読んでください。

ssh -t "$remotehost" 'sudo su -c ". ~/.profile; whoami; pwd" USER2'

あるいは、コマンドを対話型シェルに標準入力として渡すこともできます。 SSHの標準入力は端末に残る必要があるため、配管は少し難しいです。ここで文書化されたこのアプローチを使用する利点は、シェルコマンドで引用が比較的簡単であることです。つまり、リモートシェルの場合、'エスケープは必要ありません。'\''

ssh -t "$remotehost" 'sudo su - USER2 <<\EOF
whoami
pwd
EOF'

おすすめ記事