Давным давно, в незапамятные времена… Это примерно месяца три назад. У меня была задача копировать множество сайтов на хостинг. Имелся соответсвенно текстовый файл с паролями к фтп доступу. Немного поразмыслив, я решил эту задачу с использованием стандарного набора команд bash. Скрипт получился достаточно коротким . Да и в целом эту же задачу можно решить и с использованием PHP с Apache. Но меня всё интересовал вопрос как бы реализовать это, но только с возможностью копировать файлы по SSH. Конечно многие из вас будут решать проблему как-то иначе. Что было бы интересно и услышать в пределах комментариев к этому посту. Но вот занимаюсь я последнее время писанием программы на питоне и наткнулся на очень интересную особенность. О чём я с удовольствием и поведую…
Ниже и будем соединять мощь SSH и широкие возможности питона. Протокол SSH2 реализован в Питоне в виде библиотеки с именем paramiko. Из сценариев, которые содержат только программный код на языке Питон, можно организовать подключение к серверу SSH и реализовать выполнение задач SSH.
#!/usr/bin/env python import paramiko hostname='192.168.1.15' port=22 username='maxpoliver' password='megadifficultpassword' if __name__=="__main__": paramiko.util.log_to_file('paramiko.log') ssh=paramiko.SSHClient() s.load_system_host_keys() s.connect(hostname,port,username,password) stdin,stdout,sdterr=s.exec_command('ifconfig') print std.out.read() s.close()
Теперь следует обсудить листинг.
Был импортирован модуль paramiko .
Затем создан объект
SSHClient
Затем загрузка ключей хоста, которые в Линуксе извлекаются из файла
known_hosts
Затем было выполнено соединение с сервером SSH.
C использованием метода
exec_command
результатом программы будет вывод сведения о сетевых интерфейсах. Для тренировки рекомендую баловаться с со своим локальным сервером… А то мало ли что… Шутка конечно. Здесь конечно чувствуется сила джедая- простота и элегантность питона но есть одно но. Зачем нам писать программу про интерфейсы. Надо файлы копировать по сети файлы… Ну вот и следующий скрипт поможет нам в этом:
#!/usr/bin/env python import paramiko hostname='192.168.1.15' port=22 username='maxpoliver' password='megadifficultpassword' if __name__=="__main__": local_file_name='/home/username/index.htm' remote_file_name='./index.htm' paramiko.util.log_to_file('paramiko.log') ssh=paramiko.SSHClient() s.load_system_host_keys() s.connect(hostname,port,username,password) print 'transfer',local_file_name sftp.put(local_file_name,remote_file_name) s.close()
Ну вот мы передали index.htm с локальной машины на удалённую. Только надо понимать, что предварительно надо создать этот файл в папке
/home/username/index.htm
Это очень простой пример и где власть спросите вы, где то , что может быть реально интересно…Так добавим капельку баша… щепотку Линукса, можно конечно обойтись и питоном но так привычнее. Назовём вышеуказанный скрипт с заменой всего двух строк
... local_file_name='/home/username/index.htm' remote_file_name='./index.htm' ...
на
... local_file_name=sys.argv[1] remote_file_name=sys.argv[2] ...
Именем ssh_python например.
А дальше на баше пишем следующее в файл под именем multiple_ssh
#!/bin/bash find -name "*.html" -print -o -name "*.htm" -print>>$SPISOK; while read line do new=$pwd"/"$SPISOK; /home/username/ssh_python $new $SPISOK; done <$SPISOK
Дальше следует обозвать всё это дело например именем
multiple_ssh
и выставив права
chmod u+x multiple_ssh
ввести комманду
./multiple_ssh
Можно конечно добавить корректную обработку папок… Но суть ясна. Следует сразу отметить что корректно будут скопированы файл с расширением хтмл, находящиеся в каталоге в котором будет запущен верхний скрипт под названием . Кстати заранее парирую высказывания следующего содержания- а почему всё не на питоне?. Зачем bash привлекать? Ответ мой будет следующим : Да, вы правы, но идеологию я всегда исповедую одну- чём проще и быстрее – тем лучше. Для меня проще свойства баша соединить с питоном . Ну вот получился небольшой обзорчик…Будем и дальше питон изучать… Что нам готовит этот змий в будущем одному Линуксу известно…
iken
10.02.2012 - 00:41
Видимо, в ваших примерах опечатка. Вместо s.load_system_host_keys() должно быть ssh.load_system_host_keys(). Ну и далее аналогично.
[Translate]