#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 . Солигнис, ты делаешь что-то неправильно.