web-dev-qa-db-ja.com

別のユーザーとしてssh経由でリモートに引数を渡してローカルスクリプトを実行する方法

キータブ認証を使用してSSH経由でリモートサーバーでローカルスクリプトを実行しようとしています。 sachin(チケットを取得するユーザー)としてssh経由でリモートに接続でき、bashプロセスを別のユーザーremoteuserとして起動します。ここまでは順調ですね。ここにコマンドがあります

ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no -l sachin sachin@remote_Host 'Sudo -u remoteuser /bin/bash' < ./hello.sh

Hello.shに引数を渡そうとすると問題が発生します。私は以下を試しました

ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no -l sachin sachin@remote_Host 'Sudo -u remoteuser /bin/bash' < ./hello.sh "hello"

私は得る

/bin/bash: hello: Permission denied.

ただし、パラメーターなしでは、スクリプトはremoteuserとして実行されます。だから、特別な許可は必要ないと思います。

hello.shは単純なシェルスクリプトです。

#!/bin/bash
echo $1

何か問題はありますか?

3
Sachin

"hello"がスクリプトへの引数として渡されることを期待しているように見えますが、シェルへのコマンドライン引数としては指定していません。

代わりに、標準入力でスクリプトをbashに渡すには、bash -sを使用します。これにより、追加のコマンドライン引数を渡すことができます。 bash -s "hello"

ssh ...options... 'Sudo -u remoteuser /bin/bash -s "hello"' <./hello.sh

ただし、これによりシェルの標準入力ストリームがシェルスクリプトになるため、スクリプト自体の内部では標準入力からのデータの読み取りが困難になります。

別のオプションは、スクリプトをリモートシステムに転送してそこで実行することです。


あなたの命令

ssh ...options... 'Sudo -u remoteuser /bin/bash' <./hello.sh "hello"

と同じです

ssh ...options... 'Sudo -u remoteuser /bin/bash' "hello" <./hello.sh

ライン上のリダイレクトの位置はここでは問題ではありません。たとえば、 このコマンドはどのように有効ですか? "> file1 <file2 cat"

2
Kusalananda