web-dev-qa-db-ja.com

Plinkを介してWindowsコマンドラインでシェルスクリプト(パラメーターを含む)を実行する

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

私は次のように出力を取得しています

「パラメータの数が不正です」

リモートサーバーで実行されるシェルスクリプトにコマンドラインパラメーターを渡す方法はありますか?

7
aaditya 1985

-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スイッチを使用する必要はありません。

10
Martin Prikryl

Plinkの「commands.txt」でシェルスクリプトをトリガーしました。これは、以下の方法でチャームのように機能しました。

  • ファイル内の&&を使用して、スクリプトを1つのライナーとして定義できます(私は1つのライナーで定義しました)
  • <でコマンドを実行する必要があります

注:最初のEOFを<< 'EOF'のように引用符で囲みますが、最後の引用符では使用しないでください。そうしないと、コードがおかしな動作をすることがわかります。以下を参照してください。

例:

Sudo -i <<'EOF'
<your script here>
EOF

次に、最後にPlinkを使用して実行します。

plink -ssh username@hostname -pw password -m commands.txt
1
Alok Tiwari

コマンドと引数を引用符で囲んでみましたか?

つまり、-m "C:\ myscript.sh 5"

0
Marcel Kuiper