1. ホーム
  2. linux

[解決済み] sshで引数付きリモートコマンドを実行するには?

2022-03-06 14:31:54

質問

私の .bashrc 後でコマンドラインで使えるように、関数を定義しています。

function mycommand() {
    ssh [email protected] cd testdir;./test.sh "$1"
}

このコマンドを使用する場合、単に cd コマンドはリモートホストで実行されます。 test.sh コマンドはローカルホストで実行されます。これは、セミコロンが2つの異なるコマンドを区切っているためです。 ssh コマンドと test.sh コマンドを使用します。

以下のように関数を定義してみました(シングルクォーテーションに注意)。

function mycommand() {
    ssh [email protected] 'cd testdir;./test.sh "$1"'
}

を残すようにしてみました。 cd コマンドと test.sh コマンドを併用することができますが、引数 $1 は、私が関数に何を与えるかとは無関係に、解決されません。常にコマンドを実行しようとします。

./test.sh $1

をリモートホスト上で実行します。

を正しく定義するにはどうすればよいですか? mycommand のように、スクリプトの test.sh というディレクトリに移動した後、リモートホストで実行されます。 testdir に与えられた引数を渡す機能を持つ。 mycommand から test.sh ?

解決方法は?

代わりにこの方法でやってください。

function mycommand {
    ssh [email protected] "cd testdir;./test.sh \"$1\""
}

コマンド全体を一つの文字列として渡さなければならないことに変わりはないが、その一つの文字列の中に $1 を展開してからsshに送信する必要があるので "" を使用します。

更新情報

もう一つの適切な方法は、実際には printf %q を使用して、引数を適切に引用します。これにより、引数にスペース、シングルクォート、ダブルクォート、その他シェルにとって特別な意味を持つ文字が含まれていても、安全に解析することができます。

function mycommand {
    printf -v __ %q "$1"
    ssh [email protected] "cd testdir;./test.sh $__"
}

  • で関数を宣言した場合 function , () は必要ありません。
  • POSIX派だからって、それについてコメント返しをするのはやめましょう。