リモートデスクトップにSSHで接続していくつかのタスクを実行できるようにするこの機能はありますが、実際に構文とこれが可能かどうかはわかりません。
#Simple example
simple () {
ssh $1 "cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/$2; mkdir $var; cd $var; pwd";
}
上記のスクリプトを実行するとエラーが発生します。missing operand Try 'mkdir --help' for more information. /home/ubuntu
私がやりたいことは、リモートデスクトップに接続し、新しいディレクトリを作成し/home/ubuntu/$2
、そこにCDを入れて印刷することです。
PS申し訳ありません。別の場所の議論があることに言及することを忘れました。
答え1
文字列全体は、リモートホスト"cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir $var; cd $var; pwd"
に送信される前にクライアント側で拡張されます。クライアント環境ではvar
これが設定されていないため、$var
空の文字列に展開され、その結果、リモートホストで実行されるコマンドは引数なしでmkdir
実行されますcd
。
簡単な修正方法は、文字列を一重引用符で囲み、リモートホストで強制的に拡張することです。
ssh "$1" 'cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir $var; cd $var; pwd'
実際のユースケースで文字列の一部をクライアント側で拡張する必要がある場合は、二重引用符を使用してリモートで拡張する必要がある変数のみを保護できます。
ssh "$1" "cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir \$var; cd \$var; pwd"
これを行う他の方法もあります。ここにあるさまざまな文書スタイルのいずれかが適している可能性があります。
答え2
別の方法はheredocを使用することです(スーパーユーザーの質問に対する回答に含まれています)。
simple.func () {
ssh ${1}@${2} <<'EOF'
cd /home/jbutryn/test
DIR_VAR='/home/jbutryn/test/tmp'
mkdir "$DIR_VAR"
cd "$DIR_VAR"
pwd
EOF
}
dhagが指摘したように、ローカルシステム上のすべての変数をエスケープする必要があり、リモートシステム上のそのまま転送され、そこで拡張されます。一重引用符EOF
区切り記号はこれを行います。$2
ホスト名/ IPのパラメータも追加しました。どのように関数を実行したのかよくわかりませんが、今はsimple.func [user] [hostname]
ローカル位置パラメータを渡す必要があるため、次のことができます。
simple.func () {
ssh ${1} <<EOF
cd /home/jbutryn/test
DIR_VAR="/home/jbutryn/test/${2}"
mkdir '$DIR_VAR'
cd '$DIR_VAR'
pwd
EOF
}