web-dev-qa-db-ja.com

リモートマシンでローカルスクリプトを実行して引数を含めるにはどうすればよいですか?

ローカルで実行したときに正常に実行されるスクリプトを作成しました。

./sysMole -time Aug 18 18

引数"-time""Aug""18"、および"18"が正常に渡されましたスクリプトに進みます。

現在、このスクリプトはリモートマシンで実行されるように設計されていますが、ローカルマシンのローカルディレクトリから実行されます。例:

ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole

それもうまくいきます。しかし、前述の引数(-time Aug 18 18)を含めようとすると、問題が発生します。次に例を示します。

ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18

このスクリプトを実行すると、次のエラーが発生します。

bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this Shell

私が間違っていることを教えてください、これは非常にイライラします。

123
AllenD

あなたはあなたの例にかなり近かった。これらのような引数を指定して使用すると、問題なく動作します。

サンプルスクリプト:

$ more ex.bash 
#!/bin/bash

echo $1 $2

動作する例:

$ ssh serverA "bash -s" < ./ex.bash "hi" "bye"
hi bye

ただし、次のタイプの引数では失敗します。

$ ssh serverA "bash -s" < ./ex.bash "--time" "bye"
bash: --: invalid option
...

どうしたの?

発生している問題は、引数、-time、またはこの例では--timebash -sへのスイッチとして解釈されていることです。 --引数を使用して、残りのコマンドライン引数のいずれかを取得しないようにすると、bashをパシフィック化できます。

このような:

$ ssh root@remoteServer "bash -s" -- < /var/www/html/ops1/sysMole -time Aug 18 18

#1:

$ ssh serverA "bash -s" -- < ./ex.bash "-time" "bye"
-time bye

#2:

$ ssh serverA "bash -s" -- < ./ex.bash "--time" "bye"
--time bye

#3:

$ ssh serverA "bash -s" -- < ./ex.bash --time "bye"
--time bye

#4:

$ ssh  < ./ex.bash serverA "bash -s -- --time bye"
--time bye

注:sshはとにかく引数を連結してリモートシェルを呼び出すため、コマンドラインでリダイレクトが表示される場所に違いはないことを明確にするために、引用はしません例#4:のようにリモートシェルで引用する必要がある場合を除いて、大きな違いがあります。

$ ssh  < ./ex.bash serverA "bash -s -- '<--time bye>' '<end>'"
<--time bye> <end>
173
slm

次のように、コマンドを引用符で囲みます。

ssh myserver "date +\"Date: %Y%m%d %H:%M\";printf \"Uptime: \";uptime;printf \"uname: \";uname -a"
Date: 20200409 20:02
Uptime:  20:02:29 up 66 days, 55 min,  2 users,  load average: 0.06, 0.05, 0.08
uname: Linux zltcmtn23aecc1rx7322 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Connection to 105.31.182.217 closed.
0
Richard