Чому підміна процесу <() не працює з 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

Відповіді:


10

Команда:

ssh -F <(vagrant ssh-config) default

запускає vagrantкоманду в окремому процесі з її stdout, підключеним до труби. Інший кінець труби підключається як дескриптор файлу 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

1
Чудовий. З =(...)ним працює як шарм, і тимчасовий файл автоматично видаляється, коли sshсеанс закінчується. Варіант з /dev/stdinз'єднанням успішно, але виходить негайно.
cbliard

1
@cbliard, так, якщо команда, яку ви виконуєте на іншому кінці, є інтерактивною оболонкою, вона прочитає зі свого stdin (який зараз використовується труба для бродячого), побачить еоф і вихід. Ось чому я казав, якщо ти нічого не годуєшssh .
Стефан Шазелас

Гаразд, я не зрозумів, що ти маєш на увазі, якщо ти нічого не годуєшssh . Зараз це зрозуміло.
cbliard

Це все-таки правда? Я успішно використовую: ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)для об'єднання 2 файлів конфігурації під час роботи SSH. А на ZSH, я можу зробити це: ssh -F <(vagrant ssh-config) default.
CMCDragonkai

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.