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でコマンドを実行するには、そのコマンドを引数として渡す必要がありますsudo
。su
ここでの実行は役に立ちません。 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'