> 백엔드 개발 > 파이썬 튜토리얼 > Python을 사용하여 원격 서버에 자동 SSH 로그인을 작성하는 예 공유

Python을 사용하여 원격 서버에 자동 SSH 로그인을 작성하는 예 공유

零下一度
풀어 주다: 2017-06-25 10:22:35
원래의
1277명이 탐색했습니다.

우리는 서버에 연결하기 위해 UI 인터페이스가 있는 도구 영역을 사용하는 대신 컴퓨터 터미널에서 Linux 서버로 직접 SSH를 통해 연결하는 것을 선호하는 경우가 많습니다. 하지만 터미널에서 ssh를 사용할 경우 매번 계정과 비밀번호를 입력해야 하는 것도 번거로움이 있기 때문에 Linux/Mac os에서 실행되는 ssh를 통해 원격 서버에 자동으로 로그인하는 작은 도구를 간단하게 만들면 됩니다.
GIF 애니메이션 예시입니다. 먼저:

개요

먼저 필요한 기능을 정리하겠습니다.

1. 添加/删除连接服务器需要的IP,端口,密码2. 自动输入密码登录远程服务器
로그인 후 복사

예, 간단한 기능을 하겠습니다

코드 작성을 시작하겠습니다
코드가 비교적 깁니다. , 그래서 Github 및 Code Cloud에도 올렸습니다. 주소는 기사 하단에 있습니다.
1. 모듈 디렉터리 osnssh(오픈 소스 noob ssh)를 만든 다음 아래에 두 개의 디렉터리를 더 만듭니다. 프로그램을 만들고 이름을 bin으로 지정하고, 로그인 데이터(IP, 포트, 비밀번호)를 저장하는 것을 데이터라고 합니다.

-osnssh
    -bin
    -data
로그인 후 복사

1. 설정 프로그램: IP, 포트, 비밀번호 추가/삭제 py 파일 생성 bin/setting.py:

#!/usr/bin/env python#-*-coding:utf-8-*-import re, base64, os, sys
path = os.path.dirname(os.path.abspath(sys.argv[0]))'''
选项配置管理
__author__ = 'allen woo'
'''def add_host_main():while 1:if add_host():break
        print("\n\nAgain:")def add_host():'''
    添加主机信息
    :return: 
    '''
    print("================Add=====================")
    print("[Help]Input '#q' exit")# 输入IP
    host_ip = str_format("Host IP:", "^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$")if host_ip == "#q":return 1# 输入端口
    host_port = str_format("Host port(Default 22):", "[0-9]+")if host_port == "#q":return 1# 输入密码
    password = str_format("Password:", ".*")if password == "#q":return 1# 密码加密
    password = base64.encodestring(password)# 输入用户名
    name = str_format("User Name:", "^[^ ]+$")if name == "#q":return 1elif not name:
        os.system("clear")
        print("[Warning]:User name cannot be emptyg")return 0# The alias# 输入别名
    alias = str_format("Local Alias:", "^[^ ]+$")if alias == "#q":return 1elif not alias:
        os.system("clear")
        print("[Warning]:Alias cannot be emptyg")return 0# 打开数据保存文件
    of = open("{}/data/information.d".format(path))
    hosts = of.readlines()# 遍历文件数据,查找是否有存在的Ip,端口,还有别名for l in hosts:
        l = l.strip("\n")if not l:continue
        l_list = l.split(" ")if host_ip == l_list[1] and host_port == l_list[2]:
            os.system("clear")
            print("[Warning]{}:{} existing".format(host_ip, host_port))return 0if alias == l_list[4]:
            os.system("clear")
            print("[Warning]Alias '{}' existing".format(alias))return 0
    of.close()# save# 保存数据到数据文件
    of = open("{}/data/information.d".format(path), "a")
    of.write("\n{} {} {} {} {}".format(name.strip("\n"), host_ip.strip("\n"), host_port, password.strip("\n"), alias.strip("\n")))
    of.close()
    print("Add the success:{} {}@{}:{}".format(alias.strip("\n"), name.strip("\n"), host_ip.strip("\n"), host_port, password.strip("\n")))return 1def remove_host():'''
    删除主机信息
    :return: 
    '''while 1:# 打开数据文件
        of = open("{}/data/information.d".format(path))
        hosts = of.readlines()
        of.close
        l = len(hosts)if l <= 0:
            os.system("clear")
            print("[Warning]There is no host")return

        print("================Remove================")
        print("+{}+".format("-"*40))
        print("|     Alias   UserName@IP:PORT")
        hosts_temp = []
        n = 0# 遍历输出所以信息(除了密码)供选择for i in range(0, l):if not hosts[i].strip():continue
            v_list = hosts[i].strip().split(" ")
            print("+{}+".format("-"*40))
            print("| {} | {}   {}@{}:{}".format(n+1, v_list[4], v_list[0], v_list[1], v_list[2]))
            n += 1
            hosts_temp.append(hosts[i])
        hosts = hosts_temp[:]
        print("+{}+".format("-"*40))
        c = raw_input("[Remove]Choose the Number or Alias(&#39;#q&#39; to exit):")
        is_alias = False
        is_y = Falsetry:
            c = int(c)if c > l or c < 1:
                os.system("clear")
                print("[Warning]:There is no")continuedel hosts[c-1]
            is_y = Trueexcept:
            is_alias = Trueif is_alias:if c.strip() == "#q":
                os.system("clear")break  
            n = 0for l in hosts:if c.strip() == l.split(" ")[4].strip():del hosts[n]
                    is_y = True 
                n += 1if not is_y:
            os.system("clear")
            print("[Warning]:There is no")continueelse: # save# 再次确认是否删除
            c = raw_input("Remove?[y/n]:")if c.strip().upper() == "Y":
                of = open("{}/data/information.d".format(path), "w")for l in hosts:
                    of.write(l)
                print("Remove the success!")
                of.close()def str_format(lable, rule):&#39;&#39;&#39;
    用于验证输入的数据格式
    :param lable: 
    :param rule: 
    :return: 
    &#39;&#39;&#39;while 1:
        print("{} (&#39;#q&#39; exit)".format(lable))
        temp = raw_input().strip()
        m = re.match(r"{}".format(rule), temp)if m:breakelif "port" in lable:
            temp = 22breakelif temp.strip() == "#q":
            os.system("clear")break
        os.system("clear")
        print("[Warning]:Invalid format")return temp
로그인 후 복사

2. 나에 대한 정보를 출력하는 또 다른 기능을 설정합니다.

def about():&#39;&#39;&#39;
    输出关于这个程序的信息
    :return: 
    &#39;&#39;&#39;
    of = open("{}/bin/about.dat".format(path))
    rf = of.read()try:
        info = eval(rf)
        os.system("clear")
        print("================About osnssh================")for k,v in info.items():
            print("{}: {}".format(k, v))except:
        print("For failure.")return
로그인 후 복사

그런 다음 bin 디렉터리에 about.dat 파일을 만들고 다음과 같은 일부 정보를 작성합니다.

{"auther":"Allen Woo","Introduction":"In Linux or MAC using SSH, do not need to enter the IP and password for many times","Home page":"","Download address":"https://github.com/osnoob/osnssh","version":"1.1.0","email":"xiaopingwoo@163.com"
}
로그인 후 복사

이제 설정 프로그램은 다음과 같습니다.

2 원격 서버 프로그램에 자동으로 로그인합니다. bin에 있는 py 파일 auto_ssh.py라는 이름:
참고: 여기에서는 먼저 pexpect, 사용자 터미널 상호 작용, 자동으로 비밀번호를 입력하기 위한 상호 작용 정보 캡처라는 패키지를 설치해야 합니다.
pexpect 설치:

pip install pexpect
로그인 후 복사

그런 다음 코드 작성을 시작하세요:

#!/usr/bin/env python#-*-coding:utf-8-*-import os, sys, base64import pexpect
path = os.path.dirname(os.path.abspath(sys.argv[0]))def choose():# 打开我们的数据文件
    of = open("{}/data/information.d".format(path))
    hosts = of.readlines()
    hosts_temp = []for h in hosts:if h.strip():
            hosts_temp.append(h)
    hosts = hosts_temp[:]
    l = len(hosts)if l <= 0:
        os.system("clear")
        print("[Warning]Please add the host server")returnwhile 1:

        print("=================SSH===================")
        print("+{}+".format("-"*40))
        print("|     Alias   UserName@IP:PORT")for i in range(0, l):
            v_list = hosts[i].strip().split(" ")
            print("+{}+".format("-"*40))
            print("| {} | {}   {}@{}:{}".format(i+1, v_list[4], v_list[0], v_list[1], v_list[2]))
        print("+{}+".format("-"*40))
        c = raw_input("[SSH]Choose the number or alias(&#39;#q&#39; exit):")
        is_alias = False
        is_y = Falsetry:
            c = int(c)if c > l or c < 1:
                os.system("clear")
                print("[Warning]:There is no")continue
            l_list = hosts[c-1].split(" ")
            name = l_list[0]
            host = l_list[1]
            port = l_list[2]
            password = l_list[3]
            is_y = Trueexcept:
            is_alias = Trueif is_alias:if c.strip() == "#q":
                os.system("clear")returnfor h in hosts:if c.strip() == h.split(" ")[4].strip():
                    l_list = h.split(" ")
                    name = l_list[0]
                    host = l_list[1]
                    port = l_list[2]
                    password = l_list[3]
                    is_y = Trueif not is_y:continue# ssh# 将加密保存的密码解密
        password = base64.decodestring(password)
        print("In the connection...")# 准备远程连接,拼接ip:port
        print("{}@{}".format(name, host))if port == "22":
            connection("ssh {}@{}".format(name, host), password)else:
            connection("ssh {}@{}:{}".format(name, host, port), password)def connection(cmd, pwd):&#39;&#39;&#39;
    连接远程服务器
    :param cmd: 
    :param pwd: 
    :return: 
    &#39;&#39;&#39;
    child = pexpect.spawn(cmd)
    i = child.expect([".*password.*", ".*continue.*?", pexpect.EOF, pexpect.TIMEOUT])if( i == 0 ):# 如果交互中出现.*password.*,就是叫我们输入密码# 我们就把密码自动填入下去
        child.sendline("{}\n".format(pwd))
        child.interact()elif( i == 1):# 如果交互提示是否继续,一般第一次连接时会出现# 这个时候我们发送"yes",然后再自动输入密码
        child.sendline("yes\n")
        child.sendline("{}\n".format(pwd))#child.interact()    else:# 连接失败
        print("[Error]The connection fails")
로그인 후 복사

자, 이제 프로그램을 연 후 첫 번째 메뉴인 파일을 시작하기만 하면 됩니다.
3 osnssh 디렉터리에 osnssh.py 파일을 만듭니다.

#!/usr/bin/env python#-*-coding:utf-8-*-import os, sys
sys.path.append("../")from bin import setting, auto_ssh
path = os.path.dirname(os.path.abspath(sys.argv[0]))&#39;&#39;&#39;
方便在LINUX终端使用ssh,保存使用的IP:PORT , PASSWORD
自动登录
__author__ = &#39;allen woo&#39;
&#39;&#39;&#39;def main():while 1:

        print("==============OSNSSH [Menu]=============")
        print("1.Connection between a host\n2.Add host\n3.Remove host\n4.About\n[Help]: q:quit   clear:clear screen")
        print("="*40)
        c = raw_input("Please select a:")if c == 1 or c == "1":
            auto_ssh.choose()if c == 2 or c == "2":
            setting.add_host_main()if c == 3 or c == "3":
            setting.remove_host()if c == 4 or c == "4":
            setting.about()elif c == "clear":
            os.system("clear")elif c == "q" or c == "Q" or c == "quit":
            print("Bye")
            sys.exit()else:
            print("\n")if __name__ == &#39;__main__&#39;:try:
        of = open("{}/data/information.d".format(path))except:
        of = open("{}/data/information.d".format(path), "w")
    of.close()
    main()
로그인 후 복사

드디어 작성이 끝났으니 시도해 보세요.

$python osnssh.py
로그인 후 복사

구체적인 시연은 그룹에 참여하기 위해 기사 시작 부분에 GIF 애니메이션 그림 소스 코드를 넣는 것입니다

학습 과정에서 문제가 발생하면 학습 자료를 얻고 싶으시면 학습 교환 그룹
626062078에 오신 것을 환영합니다. 함께 Python을 배워보세요!

위 내용은 Python을 사용하여 원격 서버에 자동 SSH 로그인을 작성하는 예 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿