• python的paramiko模块实现远程控制和传输


    转载请注明出处

    1 安装

    sudo pip install paramiko

    2 ssh实现远程控制

    #LINUX下执行shell
    ssh username@ip  #输入密码后就可以对远程机器进行操作
    ssh username@ip command #输入密码后远程机器就执行command

    ssh运行后,想退出,可以kill掉ssh进程。

    3 paramiko实现ssh

    import paramiko
    hostname = '10.1.111.111'
    username = 'root'
    password = '111111'
    port = 22 #整数不是字符串
    paramiko.util.log_to_file('paramiko.log')
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机
    ssh.connect(hostname=hostname,port=port,username=username,password=password)
    stdin, stdout, stderr = ssh.exec_command("ls") #远程执行shell命令
    print(stdout.readlines()) #输出回显结果
    ssh.close()

    exec_command命令,以分号;分隔表示先后执行两个命令;可以传入多个参数; exec_command为单个会话,执行完成之后会回到登录时的缺省目录,如下:

    a='~/Videos'
    b='aaa'
    ssh.exec_command('cd %s;mkdir %s'%(a,b)) #aaa在a目录下
    ssh.exec_command('mkdir aaa') #aaa在缺省目录下

    远端执行命令时如果有交互,可以这样用 stdin.write(“”)来完成。

    注意:

    (1)sudo后要加-S,表示从stdin接收密码;

    (2)stdin.write(‘password ’)最后要加 作为命令的结束,否则服务器一直等待;

    (3) flush()写入的缓冲( flush() any buffer you’re writing to )

    stdin, stdout, stderr = ssh.exec_command('sudo -S ls')
    stdin.write('password
    ')
    stdin.flush()

    可以利用多进程或线程可以批量执行命令:

    import paramiko
    import threading
    
    def ssh_cmd(ip,port,username,passwd,cmd):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(ip,port,username,passwd)
        for m in cmd:
            stdin, stdout, stderr = ssh.exec_command(m)
            print(stdout.readlines()) 
        ssh.close()
    
    if __name__=='__main__':
        cmd = ['ls','ifconfig']      
        a=threading.Thread(target=ssh_cmd,args=(ip,port,username,passwd,cmd))
        a.start() 
        a.join()

    4 远程传输文件

    scp从本地服务器复制到远程服务器

    scp local_file remote_username@remote_ip:remote_file

    指定了用户名,命令执行后需要输入用户密码;如果不指定用户名,命令执行后需要输入用户名和密码; 从远处复制文件到本地

    scp remote_username@remote_ip:remote_file local_file 

    5 paramiko实现远程传输文件

    新建一个SFTPClient对象,该对象复用之前的SSH连接,因此,我们使用sftp传输文件时,不需要再次进行用户认证。实现文件上传:

    sftp = paramiko.SFTPClient.from_transport(ssh.get_transport())
    #sftp = ssh.open_sftp() #两者选其一即可
    sftp.put('bbb.c','aaa.c') #文件上传并重命名
    sftp.close()

    或者以下实现文件上传和下载:

    import paramiko
    t=paramiko.Transport((hostname,port))
    t.connect(username=username,password=password)
    sftp = paramiko.SFTPClient.from_transport(t) 
    sftp.put('bbb.c','aaa.c') #文件上传并重命名
    sftp.get('m.py', 'mm.py')#文件下载并重命名
    t.close()

    官方文档

  • 相关阅读:
    MySQL存储引擎MyISAM和InnoDB有哪些区别?
    python发起post请求获取json数据使用requests方法
    和 Python 2.x 说再见!项目移到python3
    php memcache 缓存与memcached 客户端的详细步骤
    Ubuntu16.04安装Nginx+PHP5.6+MySQL5.6
    element-ui select 下拉框 实现分页 通过css样式
    技术_pm发展历程
    前端_git用法
    前端_javascript本地实现分页(摘录)
    生活_人生感悟
  • 原文地址:https://www.cnblogs.com/straight/p/7658093.html
Copyright © 2020-2023  润新知