「ssh」を使用して、アスタリスク文字(「*」)を含む「mv」コマンドを実行します。

「ssh」を使用して、アスタリスク文字(「*」)を含む「mv」コマンドを実行します。

私はLinuxの経験はありませんが、毎日学んでいます。

私にはこのコマンドがあります。

ssh admin@$host mv repo/environments/qa/* /repo

この*文字は、environments/qaディレクトリ内のすべてのエントリがその/repoディレクトリに保存されることを意味しますか?すでに存在している場合は置き換えられますか?

申し訳ありません。私はシェルコマンドの経験がありません。ただ確認したかったです。

答え1

他の言語に翻訳された:

ssh admin@$host mv repo/environments/qa/* /repo

シェルコマンド(shやbashなどのPOSIXシェルを想定)は次のとおりです。

execute("ssh", glob(split("admin@" + $host)), "mv", glob("repo/environments/qa/*"), "/repo");

(文字に基づいて分割します$IFSが、拡張部分のみに基づいています。isや包含$hostと同様に、およびに分割され、リテラルの合計は分割されません。)$hostmachine$IFSanadmin@machineadmin@mchieanadmin

あなたはそれをしたいが:

execute("ssh", "admin@" + $host, "mv repo/environments/qa/* /repo")

シェルの構文は次のとおりです。

ssh admin@"$host" 'mv repo/environments/qa/* /repo'

ssh文字列はリモートサーバーmv repo/environment/qa/* /repoに渡されるため、sshd解釈のためにリモートユーザーのログインシェルに渡すことができます。通常は次のようになります。

execute("that-shell", "-c", "mv repo/environments/qa/* /repo")

ほとんどのシェルでは、これは次のようになります。

execute("mv", glob("repo/environments/qa/*"), "/repo")

mv隠されていないすべてのファイル(次を含むすべての種類)を移動するように指示します。目次)(それ自体は、ユーザーのホームディレクトリに初期化する必要があるrepo/environments/qaシェルプロセスの現在の作業ディレクトリへの相対パス)を1に設定します。sshd/repo

これからいくつかの結論を導き出すことができます。

  • 上記のパラメータ拡張は、$host分割+グローブを防ぐためにほとんど常に引用する必要があります。

  • リモートシステムのシェルがglobを拡張したいので、*文字通り渡す必要があります。

  • sshシェルコードをリモートで解釈すると、単純なコマンドが実行されないことを覚えておくことが重要です。複数の引数を渡す場合は、スペースで接続してリモートシェルに渡すコードを形成しますが、単純なコマンドではなくシェルコードであることを覚えておくには、コード引数だけを渡すことをお勧めします。そして、リモートシェル構文のすべての特殊文字はこのように扱われます。

    ssh host echo *.txtたとえば、これは*.txtローカルシェルによって拡張されて完了するfoo;reboot #.txtため、実行しないでください。呼び出されている現在の作業ディレクトリにファイルがある場合は、実行して再起動してください。execute("ssh", "host", "echo", "foo;reboot #.txt")sshdexecute("sh", "-c", "echo foo;reboot #.txt")


/repo¹ 存在するかタイプでない場合に注意してください。目次(またはディレクトリへのシンボリックリンク)単一repo/environments/qa/*のファイルに展開します。名前変更移動する(大引っ越す/repo;/repo問題を回避し、ディレクトリ/repo/でない場合はエラーを報告するように変更されました。/repo

関連情報