У меня есть несколько бродячих виртуальных машин. Чтобы войти в них я выдаю 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. Что я здесь не так делаю?
Ответы:
Команда:
запускает
vagrant
команду в отдельном процессе с его stdout, подключенным к каналу. Другой конец канала связан как файловый дескрипторn
(в вашем случае это 11) с новым процессом, который запускаетсяssh
и оболочка запускается:Теперь это работает, только если
ssh
не закрывает свои файловые дескрипторы при запуске.К сожалению, это так.
В случае использования
zsh
альтернативой является использование=(...)
формы подстановки процесса, при которой вместо использования канала/proc/self/fd
используется временный файл.Или вы можете использовать файловый дескриптор,
ssh
который не закрывается. Например, если вы ничего не передаетеssh
(если удаленная команда ничего не читает из stdin), вы можете использоватьfd
0, например:источник
=(...)
ним работает как талисман, и временный файл автоматически удаляется, когдаssh
сессия заканчивается. Вариант с/dev/stdin
успешно соединяется, но выходит немедленно.ssh
.ssh
. Теперь понятно.ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)
объединить 2 файла конфигурации при запуске SSH. А на ZSH, я могу сделать это:ssh -F <(vagrant ssh-config) default
.основанный на @cbliard
Это работает:
источник
=( )
делает? Я не знаком с этим.