引用符を含む変数に構文エラーがあります。

引用符を含む変数に構文エラーがあります。

2つのゲートウェイの背後には複数のLinuxマシンがあります。作成した設定にリンクするには

ssh -o ProxyCommand="ssh gateway1 nc %h %p" machines_behind_1
ssh -o ProxyCommand="ssh gateway2 nc --proxy %h %p --proxy-type socks4" machines_behind_2

このプロセスを簡素化するために、エージェントコマンドをアーカイブして簡単に使用できる環境変数を作成する必要があると思いました。だから私はそうでした。

export PGWA='-o ProxyCommand="ssh gateway1 nc %h %p"'
export PGWB='-o ProxyCommand="ssh gateway2 nc --proxy %h %p --proxy-type socks4"'

次に、接続するコンピュータに応じて、次の操作を行います。

ssh $PGWA machine_behind_1
ssh $PGWB machine_behind_2 

しかし、このようなエラーが発生します。

/bin/bash: -c: line 0: unexpected EOF while looking for matching `"'
/bin/bash: -c: line 1: syntax error: unexpected end of file

理由をご存知ですか?

ホスト名が事前にわからないため、ssh_configトリックは使用できません。 Gateway1の後に新しい仮想マシンを作成でき、最初のエージェントコマンドを使用する必要があります。

私が考えることができる唯一のことは、新しいエイリアス、関数、またはシェルスクリプトを作成し、基本的にssh -o foo $@これを代わりに使用することです。しかし、scpのエイリアス/シェルスクリプトまたは関数を生成することも覚えておく必要があります。むしろ自動でできたらいいですね。

私は似たようなことをし、ssh gw1-host設定ファイルでそれを実行してssh -o foo host最初のゲートウェイを介して変換できることを望みましたが、この正規表現操作はssh_configでは許可されていません。

別のssh / scpエイリアス/スクリプト/関数なしで私が望むことを達成する方法はありますか?

編集:環境変数をここでスタック交換にコピーして貼り付けたとき、引用符に間違いがありました。

答え1

引用符なしで書くと、$PGWA値はスペースに分割されます。引用符には特別な意味がないため、PGWA単語、、、、-oで終わります。ProxyCommand="sshgateway1nc%h%p"

バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?もっと説明したい。

二重引用符の外側の変数の拡張はほとんど常にエラーです。二重引用符を削除する理由がわからない限り、これは常に間違いです。

あなたがしなければならないのは、SSHコマンドに2つのパラメータ、およびを-o渡すことですProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4

PGWAzshでは配列に設定できます。

PGWA=(-o 'ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4')
ssh $PGWA …

bashやkshなどの他のシェルでは、引用符なしの変数拡張が分割されるという設計上の欠陥と明示的な配列構文のため、より多くの入力が必要です。

PGWA=(-o 'ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4')
ssh "${PGWA[@]}" …

shに似たシェルで動作し、多くの入力を必要としない1つの方法は、関数を定義することです。

pgwa () {
  typeset c="$1"; shift
  "$c" -o 'ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4' "$@"
}
pgwa ssh …

しかし、私の考えに最適な解決策は、これらの定義をすべて.ssh/configその場所に置くことです。これはシェル技術を必要とせず、構成は他のプログラム(rsync、sshfs、GUIファイル転送プログラムなど)で機能します。 Gateway1 の後に新しい VM を追加する場合は、エントリを追加するか、次.ssh/configを使用します。ssh -o HostName=new-vm something-behind-gateway1 …

さらに、ここでは重要ではない他のものもあります。

関連情報