Доступ к псевдонимам ~/.ssh/config из bash и python

Я использую ~/.ssh/config для управления хостами, с которыми мне часто приходится взаимодействовать. Иногда я хотел бы получить доступ к псевдонимам из этого файла в сценариях, которые не используют ssh напрямую, т.е. если у меня есть файл.ssh / config с

Host host1
  User user1
  Hostname server1.somewhere.net

Я хотел бы иметь возможность сказать что-то вроде sshcfg['host1'].Hostname получить server1.somewhere.net в скриптовых языках, особенно в Python и в Bash.

Я бы предпочел сделать это стандартными инструментами / библиотеками, если это возможно. Я также предпочел бы, чтобы инструменты автоматически определяли текущую конфигурацию из среды, а не указывали явно на файл конфигурации. Я не знаю, есть ли способ иметь альтернативные конфиги в ssh, но если есть, я бы хотел автоопределить текущий активный. В противном случае будет достаточно просто установить значение по умолчанию "~/.ssh/config".

2 ответа

Использование Парамико

Paramiko — это реализация протокола SSHv2 на чистом Python (3.6+), обеспечивающая как клиентскую, так и серверную функциональность.

Вам могут не понадобиться все функции, которые предоставляет Paramiko, но, судя по их документации, этот модуль может делать именно то, что вам нужно: paramiko.config.SSHConfig .

Представление информации о конфигурации, сохраненной в формате, используемом OpenSSH. Запросы можно делать через поиск. Формат описан на справочной странице OpenSSH ssh_config. Этот класс предоставляется в первую очередь для удобства пользователей posix (поскольку формат OpenSSH является стандартом де-факто для posix), но он должен нормально работать и в Windows.

Вы можете определить нестандартный файл конфигурации так же, как вы указали бы альтернативный файл конфигурации ssh для командной строки ssh, как упоминалось в предыдущем ответе:

      config = SSHConfig.from_file(open("some-path.config"))
# Or more directly:
config = SSHConfig.from_path("some-path.config")
# Or if you have arbitrary ssh_config text from some other source:
config = SSHConfig.from_text("Host foo\n\tUser bar")

Затем вы можете получить любую конфигурацию, которая вам нужна, например

Например, с таким файлом конфигурации:

      Host foo.example.com
    PasswordAuthentication no
    Compression yes
    ServerAliveInterval 60

Вы можете получить доступ к различным настройкам, используя:

      my_config = SSHConfig()
my_config.parse(open('~/.ssh/config'))
conf = my_config.lookup('foo.example.com')

assert conf['passwordauthentication'] == 'no'
assert conf.as_bool('passwordauthentication') is False
assert conf['compression'] == 'yes'
assert conf.as_bool('compression') is True
assert conf['serveraliveinterval'] == '60'
assert conf.as_int('serveraliveinterval') == 60

Если вам нужны только доступные имена хостов, вы можете перечислить все доступные, а затем получить информацию об их конфигурации, используя этот контекст (подробнее здесь )

      get_hostnames()

Возвращает набор буквальных имен хостов, определенных в конфигурации SSH (как явные имена хостов, так и записи с подстановочными знаками).

Это может не соответствовать вашему запросу на стандартную библиотеку, хотя проект, похоже, активно поддерживается и широко используется.

Можно указать альтернативный файл конфигурации в командной строке, но ~/.ssh/config всегда используется по умолчанию. Для альтернативного файла конфигурации используйте -F configfile вариант.

Вы можете либо попытаться проанализировать исходный файл конфигурации, либо иметь файл, который лучше подходит для манипуляций, и сгенерировать из него альтернативный файл конфигурации или часть файла конфигурации по умолчанию.

Другие вопросы по тегам