プロセス置換<()がssh -Fで機能しないのはなぜですか


11

迷惑な仮想マシンがいくつかあります。それらにログインするには、vagrant sshコマンドを発行します。通常のsshコマンドでログインしたい。vagrant 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

この設定をファイルに出力して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でも同じ動作が見られます。ここで何が悪いのですか?


2
sshが予期しないファイル記述子をすべて閉じているようです。
ctrl-alt-delor 2013年

回答:


10

コマンド:

ssh -F <(vagrant ssh-config) default

vagrantstdoutがパイプに接続されている別のプロセスでコマンドを実行します。パイプのもう一方の端は、ファイル記述子n(この場合は11)として実行される新しいプロセスに接続されssh、シェルが実行されます。

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

ssh起動時にファイル記述子を閉じない場合にのみ機能します。

残念ながら、そうです。

を使用するzsh場合の代替手段は=(...)、パイプとを使用する代わりに/proc/self/fd一時ファイルを使用するプロセス置換の形式を使用することです。

または、ssh閉じないファイル記述子を使用することもできます。たとえば、何もフィードしていないssh場合(リモートコマンドがstdinから何も読み取っていない場合)は、fd0を使用できます。例:

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

素晴らしい。=(...)それは魔法のように動作してたときに、一時ファイルは自動的に削除されssh、セッションが終了します。バリアント/dev/stdinは正常に接続しますが、すぐに終了します。
cbliard 2013年

1
@cbliard、はい、反対側で実行するコマンドが対話型シェルの場合、コマンドはstdin(現在はvagrantに使用されているパイプ)から読み取り、eofを確認して終了します。だから、に何も与えていないsshのかと私は言っていました
ステファンChazelas

OK、何も食べさせないなら、あなたがssh何を意味しているの理解できませんでした。今では明らかです。
cbliard 2013年

これはまだ本当ですか?私は正常に使用しています:ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)SSHを実行するときに2つの構成ファイルを結合します。ZSHでは、これを行うことができますssh -F <(vagrant ssh-config) default
CMCDragonkai 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.