私のスクリプトのコマンドは次のとおりです。
ssh -i $KEY $USER@$HOST "sudo su tom; echo $DATA >> /home/user/file.txt
これらのコマンドは個別にはうまく機能しますが、スクリプトで一緒に使用すると中断されます。
このコマンドを単独で実行すると、sudo su tom; cat /home/user/file.txt
ユーザーtomをログアウトしたときにのみcatが実行されます。
bashスクリプトでユーザーを変更してコマンドを実行するには?
答え1
Paul Calabroが提案したもの(私の考えではこれは主な問題ではないようです)に加えて、リモートコンピュータでコマンドを実行するために使用されるコマンドラインソルバー(シェル)も定義する必要があります。ローカルコンピュータとは異なるシェルがある可能性があるためです。マスター。
-t
コマンドのパラメータも必要だと思いますssh
。
-t は擬似 tty 割り当てを強制します。これは、リモートコンピュータ上で任意の画面ベースのプログラムを実行するために使用することができ、これは、例えばメニューサービスを実装する場合に有用である。複数の -t オプションは、ssh にローカル tty がない場合でも tty 割り当てを強制します。
以下はあなたが探しているものに近いものです。
ssh -it $KEY $USER@$HOST 'sudo su tom; echo $DATA >> /home/user/file.txt; bash'
残念ながら、上記のソリューションではsudo su
&&の "concat"はecho
まだ機能しませんが、コマンド-c
引数を使用するとsu
問題が解決します。
-c, --command=COMMAND 単一の COMMAND をシェルに渡すには、-c を使用します。
答え2
指定したコマンドは次のとおりです。
ssh -i $KEY $USER@$HOST "sudo su tom; echo $DATA >> /home/user/file.txt
これに関するいくつかの小さな注意:
- このコマンドは、スペースが含まれている
$KEY
と予期しない動作を生成します。 (不可能ではありません。)$USER
$HOST
$DATA
ssh
リモートでログインしているホストではなく、コマンドを実行しているホストを展開します。 (私はこれがあなたの意図であると仮定します.)"
コマンドの最後に閉じるステートメントはありません。コピー - 貼り付けエラーのようです。
このコマンドのポイントと問題を解決するコマンドについて説明します。
sudo
root
. それはマンページを引用するために使用されます。
sudo, sudoedit - execute a command as another user
だから、希望する簡単なコマンド例:
ssh -i $KEY $USER@$HOST "sudo -u tom echo $DATA >> /home/user/file.txt"
これは$USER
書き込み権限を想定しています/home/user/file.txt
。tom
これらの権限を持っている人だけがいる場合は、次を使用してください。
ssh -i $KEY $USER@$HOST "sudo -u tom -i 'echo $DATA >> /home/user/file.txt'"
詳細についてはを読んでくださいman sudo
。
答え3
ユーザーを切り替えることはできません。ルートとして実行することはトリックを実行するようです。
ssh -i $KEY $USER@$HOST "echo "$DATA" |sudo tee $DIRECTORY"