Mam jakieś wirtualne maszyny wirtualne. Aby się do nich zalogować, wydaje vagrant ssh
polecenie. Chcę się do nich zalogować za pomocą zwykłego ssh
polecenia. vagrant ssh-config
Wysyła odpowiedni plik konfiguracyjny
$ 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
Kiedy wypisujesz tę konfigurację do pliku i używasz z ssh -F
, wszystko działa dobrze:
$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully
Podczas korzystania z operatora podstawiania procesów w <(cmd)
celu uniemożliwienia utworzenia tymczasowego pliku konfiguracyjnego nie powiedzie się:
$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory
Ten sam błąd występuje podczas używania <(cat /tmp/config)
$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory
Używam zsh i obserwuję to samo zachowanie z bash. Co robię tutaj źle?
bash
ssh
zsh
file-descriptors
process-substitution
Cbliard
źródło
źródło
Odpowiedzi:
Komenda:
uruchamia
vagrant
polecenie w osobnym procesie, a jego standardowe wyjście jest podłączone do potoku. Drugi koniec potoku jest podłączony jako deskryptor plikun
(w twoim przypadku jest to 11) do nowego procesu, który działa,ssh
a powłoka działa:Teraz działa to tylko wtedy,
ssh
gdy nie zamyka deskryptorów plików podczas uruchamiania.Niestety tak jest.
Jeśli używasz
zsh
, alternatywą jest użycie=(...)
formy podstawienia procesu, w której zamiast rury/proc/self/fd
używa pliku tymczasowego.Lub możesz użyć deskryptora pliku,
ssh
który się nie zamyka. Na przykład, jeśli nic nie podajeszssh
(jeśli zdalne polecenie nie odczytuje niczego ze standardowego wejścia), możesz użyćfd
0, np .:źródło
=(...)
temu działa jak urok, a plik tymczasowy jest automatycznie usuwany po zakończeniussh
sesji. Wariant z/dev/stdin
łączy się pomyślnie, ale wychodzi natychmiast.ssh
.ssh
. Teraz jest jasne.ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)
do łączenia 2 plików konfiguracyjnych razem podczas uruchamiania SSH. I zsh, mogę to zrobić:ssh -F <(vagrant ssh-config) default
.na podstawie @cbliard
To działa:
źródło
=( )
robi? Nie znam tego.