プロセス置換<()がssh -Fで機能しない理由

プロセス置換<()がssh -Fで機能しない理由

迷子になった仮想マシンがあります。これを記録するためにvagrant sshコマンドを実行します。通常のコマンドを使用してログインしたいですsshvagrant ssh-config適切な設定ファイルを出力します。

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2201
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/cbliard/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

この設定をファイルに出力し、 with ssh -F: を使用すると、すべてがうまく動作します。

$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully

<(cmd)一時構成ファイルが生成されないように、プロセス置換演算子を使用すると失敗します。

$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory

使用時に同じエラーが発生しました。<(cat /tmp/config)

$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory

私はzshを使用しており、bashでも同じ動作を観察しています。私がここで何を間違っているのか?

答え1

注文する:

ssh -F <(vagrant ssh-config) default

vagrantパイプに接続されている標準出力を使用して、別々のプロセスでコマンドを実行します。パイプのもう一方の端は、n実行中の新しいプロセスにファイル記述子(あなたの場合は11)で接続され、sshシェルが実行されます。

ssh -F /proc/self/fd/n default

sshこれは、起動時にファイル記述子が閉じられていない場合にのみ機能します。

残念ながらそうです。

使用される場合のもう1つのアプローチは、パイプと一時ファイルを使用せずに代わりに一時ファイルを使用するプロセス代替形式をzsh使用することです。=(...)/proc/self/fd

sshあるいは、閉じられていないファイル記述子を使用することもできます。たとえば、何も指定しない場合ssh(リモートコマンドがstdinから何も読み取らない場合)、fd0を使用できます。たとえば、次のようになります。

vagrant ssh-config | ssh -F /dev/stdin -n default

答え2

@cbliardベース

これは働きます:

ssh -F =(vagrant ssh-config ) -i =(generate ssh-identity)

関連情報