Как я мог бы изменить файл ssh_config на хосте Linux с помощью perl?

#perl #ssh

#perl #ssh

Вопрос:

У меня интересная проблема, мой скрипт использует ssh для доступа к моему серверу vmware, чтобы извлекать с него данные. Я обнаружил, что если машина, на которой запущен скрипт, никогда не подключалась к серверу, скрипт не сможет запуститься, потому что вопрос, спрашивающий, должен ли хост, к которому я подключен, быть добавлен в мой файл известных hosts.

На основе чтения некоторых форумов и тому подобного, а также людей, сталкивающихся с аналогичной проблемой, мне пришла в голову идея. Я хотел изменить ssh_config файл на «хосте скрипта», чтобы исключить проверку известного хоста на хост, указанный в файле конфигурации. Это было бы сделано с помощью созданного мной скрипта конфигурации, который задает вам различные вопросы, генерирующие файл конфигурации xml.

Теперь о проблеме…

Мне нужно изменить файл конфигурации, я подумал, что проще всего было бы перенести файл в perl и манипулировать им. Перебор, который я делал раньше, но, согласно тому, что я прочитал, директива для отключения определенных параметров ssh на хосте perticular должна предшествовать директиве global options.

Как я могу вставить текст между двумя блоками текста в текущем файле?

Вот как выглядит мой ssh_config

 # This is the ssh client system-wide configuration file.  See
# ssh_config(5) for more information.  This file provides defaults for
# users, and the values can be changed in per-user configuration files
# or on the command line.

# Configuration data is parsed as follows:
#  1. command line options
#  2. user-specific file
#  3. system-wide file
# Any configuration value is only changed the first time it is set.
# Thus, host-specific definitions should be at the beginning of the
# configuration file, and defaults at the end.

# Site-wide defaults for some commonly used options.  For a comprehensive
# list of available options, their meanings and defaults, please see the
# ssh_config(5) man page.

**--This is what my modification need to go--**

Host *
#   ForwardAgent no
#   ForwardX11 no
#   ForwardX11Trusted yes
#   RhostsRSAAuthentication no
#   RSAAuthentication yes
#   PasswordAuthentication yes
#   HostbasedAuthentication no
#   GSSAPIAuthentication no
#   GSSAPIDelegateCredentials no
#   GSSAPIKeyExchange no
#   GSSAPITrustDNS no
#   BatchMode no
#   CheckHostIP yes
#   AddressFamily any
#   ConnectTimeout 0
#   StrictHostKeyChecking ask
#   IdentityFile ~/.ssh/identity
#   IdentityFile ~/.ssh/id_rsa
#   IdentityFile ~/.ssh/id_dsa
#   Port 22
#   Protocol 2,1
#   Cipher 3des
#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
#   MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
  

Комментарии:

1. Почему бы просто не использовать ssh -oStrictHostKeyChecking=no в вашем скрипте?

2. Потому что я использую модуль Net::OpenSSH. Также я не хочу изменять его глобально только для конкретного хоста. Последнее является большей причиной.

3. просто подключите его к ssh один раз и введите «да». Проверка предусмотрена для вашей защиты.

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

Ответ №1:

Вы можете получить доступ к строкам файла через массив Perl с помощью модуля core Tie::File . Например, для вставки строки с использованием смещения:

 use Tie::File;
tie @array, 'Tie::File', $file or die "Can't tie $file";
splice @array, $offset, 0, $line;
  

Вы также можете перебирать массив и т.д. Изменения в массиве немедленно отражаются в файле.

Комментарии:

1. Что тогда? Построчно сбрасывать массив обратно в файл с помощью цикла?

2. Хммм, похоже, у меня возникли проблемы с получением Tie :: File для сборки, он продолжает проваливать кучу тестов. Make не будет его создавать. План Б?

3. @Solignis: вам не нужно его устанавливать, это основной модуль.

4. Не в моей системе, говорится, что он не был установлен. Я использую perl 5.10.1 в Debian 6. В любом случае, я нашел патч для устранения проблемы со сборкой. Make создал файл, чтобы я мог его установить.

5. Tie::File впервые был выпущен с perl версии 5.7.3 в соответствии с corelist . Он также правильно упакован в Debian . Солигнис, ты делаешь что-то неправильно.