WindowsからLinuxボックス内でリモートでシェルスクリプトを実行する必要があります
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
exit
fi
echo "$1"
これが私がWindowsコマンドプロンプトから実行したコマンドです
cmd> plink.exe -ssh username@Host -pw gbG32s4D/ -m C:\myscript.sh 5
私は次のように出力を取得しています
「パラメータの数が不正です」
リモートサーバーで実行されるシェルスクリプトにコマンドラインパラメーターを渡す方法はありますか?
-m
スイッチがどのように機能するかを誤解しています。
これは、ローカルファイルからサーバーに送信するコマンドをplink
にロードさせる方法にすぎません。
ファイルは、リモートサーバーにアップロードおよび実行されません(引数付き)。
その内容はローカルで読み取られ、サーバーに送信され、(リモート)コマンドラインで入力したかのようにそこで実行されます。あなたはそれに議論を与えることはできません。
回避策は、バッチファイル(たとえばrun.bat
)からplink
を実行する前に、その場でファイルをローカルで生成することです。
echo echo %1 > script.tmp
plink.exe -ssh username@Host -pw gbG32s4D/ -m script.tmp
次に、引数を指定してバッチファイルを実行します。
run.bat 5
上記により、スクリプトはサーバー上でecho 5
を実行します。
スクリプトが複雑な場合は、ローカルで組み立てるのではなく、サーバー上で準備して(@MarcelKuiperが提案したように)、Plinkを介してスクリプトだけを実行します。
plink.exe -ssh username@Host -pw gbG32s4D/ "./myscript.sh %1"
この場合、実行するコマンドは1つだけなので、引数を含めてPlinkコマンドラインで渡すことができます。 (一時)ファイルで-m
スイッチを使用する必要はありません。
Plinkの「commands.txt」でシェルスクリプトをトリガーしました。これは、以下の方法でチャームのように機能しました。
注:最初のEOFを<< 'EOF'のように引用符で囲みますが、最後の引用符では使用しないでください。そうしないと、コードがおかしな動作をすることがわかります。以下を参照してください。
例:
Sudo -i <<'EOF'
<your script here>
EOF
次に、最後にPlinkを使用して実行します。
plink -ssh username@hostname -pw password -m commands.txt
コマンドと引数を引用符で囲んでみましたか?
つまり、-m "C:\ myscript.sh 5"