Решено Объединить два скрипта на python

S

Sv9tka

Добрый день! есть два, созданных мной скрипта, которые работают по отдельности. Необходимо один в другой вставить, но никак не могу разобраться сколько циклов, условий ставить. Мой синтаксис на phyton еще серьезно страдает.

Python:
import paramiko, time, urllib.request, socket

host = '10.xx.xx.102'
user = 'root'
psw = 'root'
port = 22

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:
    if(ssh):
        ssh.connect(hostname=host, port=port, username=user, password=psw, timeout=10)
        while True:
            stdin, stdout, stderr = ssh.exec_command('service nginx start',timeout=10)
           
            while not stdout.channel.exit_status_ready():
                if stdout.channel.recv_ready():
                    time.sleep(3)
                    #stdoutLines = stdout.readlines()
                    print("SSH - ждем 3 сек")
                    #ssh.close()
            try:
                urllib.request.urlopen('host')
                return True
            except ValueError:
                print ('Адреса не существует')
       
        else:
            print('Не запущен nginx')
    else:
        ssh.close()
        print("SSH - не могу подключиться")

except Exception as e:
    print(e)
    ssh.close()

И второй код:

Python:
import paramiko

host = '10.xx.xx.102'
user = 'root'
psw = 'root'
port = 22

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
    if(ssh):
        ssh.connect(hostname=host, port=port, username=user, password=psw, timeout=5)
        try:
            sftp = ssh.open_sftp()
            for i in sftp.listdir('/etc/nginx/conf.d/'):
                if "default.conf" in i:
                    sftp.posix_rename('/etc/nginx/conf.d/default.conf', '/etc/nginx/conf.d/default.conf_1')
                    sftp.put(r'C:\Users\ivanov\Documents\default.conf', '/etc/nginx/conf.d/default.conf')

                    print("SSH - успешно, default.conf переименован и заменен")
                    ssh.close()
            else:  
                sftp.put(r'C:\Users\ivanov\Documents\default.conf', '/etc/nginx/conf.d/default.conf')

                print("SSH - успешно, default.conf не было, залит")
                ssh.close()
        except Exception as e:
            print(e)
            ssh.close()
    else:
        ssh.close()
        print("SSH - не могу подключиться")

except Exception as e:
    print(e)
    ssh.close()

Смысл скриптов:
Когда запускаем 1й скрипт, он подключается по ssh, пробует запустить nginx, проверяет url, если норм то закрывается сессия, если нет пытается еще раз. Второй скрипт подключается по ssh, заменяет в каталоге /etc/nginx/conf.d/ файл default.conf.
Необходимо их объединить, чтобы в первом скрипте, после того как сервер nginx не заупстился, запускать sftp и заменять default.confзатем опять пытаться запустить сервер.
 
Последнее редактирование:
N

nergilzaner

разбей скрипт на функции, одна функция - одна задача, например def exchange_default_conf(), def run_server(), одна задача - одна функция, и тело def main(): с логикой внутри, старайся писать "чистые" функции
 
  • Нравится
Реакции: Dr.Lafa
S

Sv9tka

хм, и тогда можно уже функции в while и if else вставлять, так? щас попробую
 
N

nergilzaner

хм, и тогда можно уже функции в while и if else вставлять, так? щас попробую
да, все повторяющиеся елементы кода - в отдельные функции, логика отдельно. except внутри except - так быть не должно, могут возникнуть неотслеживаемые ошибки, Exception слишком широкий спектр - лучше конкретизировать
 
S

Sv9tka

Получилось вот так:

Python:
def join():
        ssh.connect(hostname=host, port=port, username=user, password=psw, timeout=10)
       
def command():
        stdin, stdout, stderr = ssh.exec_command('service nginx start',timeout=10)
       
def back_otvet():
    while not stdout.channel.exit_status_ready():
        if stdout.channel.recv_ready():
        time.sleep(3)
        #stdoutLines = stdout.readlines()
        print("SSH - ждем 3 сек")
       
def url_nginx():
    try:
        urllib.request.urlopen('host')
        return True
    except ValueError:
        print ('Адреса не существует')
       
def sftp_nginx():
    for i in sftp.listdir('/etc/nginx/conf.d/'):
        if "default.conf" in i:
            sftp.posix_rename('/etc/nginx/conf.d/default.conf', '/etc/nginx/conf.d/default.conf_1')
            sftp.put(r'C:\Users\ivanov\Documents\default.conf', '/etc/nginx/conf.d/default.conf')
            print("SSH - успешно, default.conf переименован и заменен")
    else:  
        sftp.put(r'C:\Users\ivanov\Documents\default.conf', '/etc/nginx/conf.d/default.conf')
        print("SSH - успешно, default.conf не было, залит")
 
Последнее редактирование:
N

nergilzaner

ну уже ближе, сам скрипт рабочий? ты проверил(а)?
 
Последнее редактирование:
S

Sv9tka

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

Родил скрипт, но все равно как то он на синтаксис ругается, прошу помочь:

Python:
import paramiko, time, urllib.request, socket

host = '10.xx.xx.102'
host_url = 'http://%s/' % (host)
user = 'root'
psw = 'root'
port = 22

def join():
    ssh.connect(hostname=host, port=port, username=user, password=psw, timeout=10)
    
def command():
    stdin, stdout, stderr = ssh.exec_command('service nginx start',timeout=10)
    
def back_otvet():
    while not stdout.channel.exit_status_ready():
        if stdout.channel.recv_ready():
            print("SSH - ждем 3 сек")
            time.sleep(3)
    
def url_nginx():
    try:
        urllib.request.urlopen('host_url')
    except ValueError:
        print ('Адреса не существует')
    
def sftp_nginx():
    for i in sftp.listdir('/etc/nginx/conf.d/'):
        if "default.conf" in i:
            sftp.posix_rename('/etc/nginx/conf.d/default.conf', '/etc/nginx/conf.d/default.conf_1')
            sftp.put(r'C:\Users\ivanov\Documents\default.conf', '/etc/nginx/conf.d/default.conf')
            print("SSH - успешно, default.conf переименован и заменен")
    else:
        sftp.put(r'C:\Users\ivanov\Documents\default.conf', '/etc/nginx/conf.d/default.conf')
        print("SSH - успешно, default.conf не было, залит")


def main():
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    try:
        join()
            while command()
                back_otvet()
                url_nginx()
            else sftp_nginx()
    except Exception as e:
        print(e)
        ssh.close()
    
#Вызов всей функции
main()
 
N

nergilzaner

ну он же на while в main() должен ругаться - отступ
повнимательнее) читай трэйсбэк, не торопись

удобно, кстати, использовать конструкцию для запуска скрипта:
if __name__ == '__main__':
main()
 
  • Нравится
Реакции: Sv9tka
S

Sv9tka

Хорошо! сажусь за углубленный мануал, эх. Спасибо за конструкцию!

Не могу понять, пишет

, но файл есть, все файлы есть. В общем затык у меня...

Python:
import paramiko, time, urllib.request, socket

host = '10.хх.хх.102'
host_url = 'http://%s/' % (host)
user = 'root'
psw = 'root'
port = 22
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

def join():
    ssh.connect(hostname=host, port=port, username=user, password=psw, timeout=10)
       
def command():
    stdin, stdout, stderr = ssh.exec_command('service nginx start',timeout=10)
       
def back_otvet():
    while not stdout.channel.exit_status_ready():
        if stdout.channel.recv_ready():
            print("SSH - ждем 3 сек")
            time.sleep(3)
       
def url_nginx():
    try:
        urllib.request.urlopen('host_url')
    except ValueError:
        print ('Адреса не существует')
       
def sftp_conf():
    sftp = ssh.open_sftp()
    for i in sftp.listdir('/etc/nginx/conf.d/'):
        if "default.conf" in i:
            sftp.posix_rename('/etc/nginx/conf.d/default.conf', '/etc/nginx/conf.d/default.conf_1')
            sftp.put(r'C:\Users\ivanov\Documents\default.conf', '/etc/nginx/conf.d/default.conf')
            print("SSH - успешно, default.conf переименован и заменен")
    else:   
        sftp.put(r'C:\Users\ivanovDocuments\default.conf', '/etc/nginx/conf.d/default.conf')
        print("SSH - успешно, default.conf не было, залит")
    ssh.close()

def sftp_index():
    sftp = ssh.open_sftp()
    sftp.put(r'C:\Users\ivanov\Documents\index.html', '/usr/share/ngnix/html/index.html')
    print("SSH - успешно залит index.html")
    ssh.close()

def main():
    try:
        join()                                           #пробуем подключиться по ssh
        while False:
            command()                           #запускаем nginx
            back_otvet()                          #ждем ответ после запуска команды
            if():
                url_nginx()                         #проверяем открывается ли урл
            else:
                sftp_conf()                         #если не открывается заливаем файл конфига
        else:
            sftp_index()                           #заливаем файл Index.html На сайт
            ssh.close()
            print('Можно работать')
    except Exception as e:
        print(e)
        ssh.close()
       
#Вызов всей функции
if __name__ == '__main__':
    main()

Плюс еще host_url выдает в процессе, что такого адреса не существует, причем именно не ip говорит что не существует, а именно host_url. Как будто не происходит подмена ip, хотя print выводит правильный ip.
Заранее благодарю!
 
N

nergilzaner

твой скрипт сейчас нет времени у себя поднять, сори, (кстати ты на виртуалках или на боевом сервере?)
первые два скрипта были рабочие?
проверяй пошагово, каждую функцию отдельно,
попробуй либу - requests она вроде удобней...
 
  • Нравится
Реакции: Sv9tka
N

nergilzaner

поздравляю, для проектов удобно использовать модуль argparse ( ), он работает с аргументами командной строки, крутая вещь чекни, удачи)
 
  • Нравится
Реакции: Sv9tka

apnem19

New member
21.08.2020
1
0
BIT
0
вот у меня есть 3 файла питон мне нужно объяденить в один как это сделать?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!