RSS
 

Питон и SSH

08 Июл

Питон SSH

Давным давно, в незапамятные времена… Это примерно месяца три назад. У меня была задача копировать множество сайтов на хостинг. Имелся соответсвенно текстовый файл с паролями к  фтп доступу. Немного поразмыслив, я решил эту задачу с использованием стандарного набора команд 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 привлекать? Ответ мой будет следующим : Да, вы правы, но идеологию я всегда исповедую одну- чём проще и быстрее – тем лучше. Для меня проще свойства баша соединить с питоном . Ну вот получился небольшой обзорчик…Будем и дальше питон изучать… Что нам готовит этот змий в будущем одному Линуксу известно…

Google Bookmarks Reddit Technorati Yahoo My Web БобрДобр.ru Memori.ru МоёМесто.ru
 

Прокомментировать

 
 
  1. iken

    10.02.2012 - 00:41

    Видимо, в ваших примерах опечатка. Вместо s.load_system_host_keys() должно быть ssh.load_system_host_keys(). Ну и далее аналогично.

     
 
Система Orphus

Enter your email address:

Delivered by FeedBurner

.