![BashスクリプトでSSHを使用して、サーバーの変数に関連するコマンドを実行します。 [閉鎖]](https://linux33.com/image/103525/Bash%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7SSH%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E5%A4%89%E6%95%B0%E3%81%AB%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%5B%E9%96%89%E9%8E%96%5D.png)
私は入力を受け入れ、リモートサーバーに接続し、与えられた入力を使用して一連のコマンドを実行するbashスクリプトを作成しました。これよりはるかに複雑になりますが、次は非常に簡単な例です。
#!/bin/bash
NAME=$1
echo $NAME
ssh user@server "ls $NAME"
bashスクリプトのsshコマンドにファイル名をハードコードすると応答を受け取り、$NAMEをマイファイル名に設定してコマンドラインに正しい行を入力すると、正しい応答を受け取りますが、結合されたファイル名を渡します。スクリプトに「ls」を返そうとすると、「該当するファイルやディレクトリがありません」というエラーが返されます。私が提供したファイル名が反映されたので、$NAMEに正しく保存されました。私は何が間違っていましたか?
答え1
$NAME
何らかの方法でシェルによって拡張される文字(スペースやなど)が含まれていると、問題が$
発生します。あなたはそれらから脱出する必要があります。早く受け取る非常に毛深い。すべてのケースを満たすには、ファイル名をリモートにコピーされたファイルに入れてから、その内容をコマンドの引数として使用する必要があります。それは次のとおりです。
NAME="$1"
TMPF=/tmp/tmpf-$$ # If you have mktemp then use that instead
printf %s "$NAME" >$TMPF
scp "$TMPF" user@server:$TMPF
ssh user@server "ls \"$(cat $TMPF)\""