ssh 設定 (~/.ssh/config) 内のコマンドのシェルを上書きする

ssh 設定 (~/.ssh/config) 内のコマンドのシェルを上書きする

Match execそこで、 IP の一致を取得するために使用しているユーザー用の SSH 構成ファイルがあります。

Match exec "echo %h | grepcidr 192.168.12.0/20  &>/dev/null "
  User         ubuntu
  ProxyCommand          ssh my-bastion -W %h:%
  IdentityFile          ~/.ssh/target.pem

これは私のホストでは問題なく動作しますが、openssh-clientがインストールされているコンテナで起動しようとしましたが、コマンドが成功したとみなされるため(ネットワークをターゲットにしていない場合でも)、ssh接続が失敗し、要塞を通過しようとします。

debug1: Executing command: 'echo my.host.com | grepcidr 192.168.12.0/20 &>/dev/null '
debug3: command returned status 0

私のホストでは返されます

debug1: Executing command: 'echo my.host.com | grepcidr 192.168.12.0/20 &>/dev/null '
debug3: command returned status 1

これはコンテナのsshコマンドが返すものであるはずです

調べてみると、コンテナ内のsshコマンドは を使って起動されるsh -cのに対し、ホスト上で起動されるsshコマンドは で起動さbash -c れることがわかりました。コマンドラインで両方をテストし、コマンドの戻り値をチェックすることで、これが原因であることが確認できます。echo $?

ssh コマンドにのみ使用するように指定する方法はありますかbash?

SHELLコマンドラインの先頭で環境変数を上書きすることができます

SHELL=/bin/bash ssh [email protected]

しかし、私の目標は、その背後で Ansible を使用することなので、すべての SSH のシェルを無効にしたいと思います。

答え1

で始まる代替コマンドを指定するかbash -c、Bashism (つまり、&>stdout と stderr のリダイレクト) を削除することができます。

はC 関数Match execのようなものを使用するためsystem()、どのシェルを提供するかはランタイム システム (C ライブラリ) によって決まります。ほとんどの Unix システムでは、これはsh -cコマンド ライン全体と変換されます。この部分は変更できません。

関連情報