本文介绍了python的paramiko模块实现远程控制和传输示例,分享给大家,具体如下:
1 安装
1
|
sudo pip install paramiko |
2 ssh实现远程控制
1
2
3
|
#LINUX下执行shell ssh username@ip #输入密码后就可以对远程机器进行操作 ssh username@ip command #输入密码后远程机器就执行command |
ssh运行后,想退出,可以kill掉ssh进程。
3 paramiko实现ssh
1
2
3
4
5
6
7
8
9
10
11
12
|
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为单个会话,执行完成之后会回到登录时的缺省目录,如下:
1
2
3
4
|
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\n')最后要加\n作为命令的结束,否则服务器一直等待;
(3) flush()写入的缓冲( flush() any buffer you're writing to )
1
2
3
|
stdin, stdout, stderr = ssh.exec_command( 'sudo -S ls' ) stdin.write( 'password\n' ) stdin.flush() |
可以利用多进程或线程可以批量执行命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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从本地服务器复制到远程服务器
1
|
scp local_file remote_username@remote_ip:remote_file |
指定了用户名,命令执行后需要输入用户密码;如果不指定用户名,命令执行后需要输入用户名和密码; 从远处复制文件到本地
1
|
scp remote_username@remote_ip:remote_file local_file |
5 paramiko实现远程传输文件
新建一个SFTPClient对象,该对象复用之前的SSH连接,因此,我们使用sftp传输文件时,不需要再次进行用户认证。实现文件
上传:
1
2
3
4
|
sftp = paramiko.SFTPClient.from_transport(ssh.get_transport()) #sftp = ssh.open_sftp() #两者选其一即可 sftp.put( 'bbb.c' , 'aaa.c' ) #文件上传并重命名 sftp.close() |
或者以下实现文件上传和下载:
1
2
3
4
5
6
7
|
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() |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/straight/p/7658093.html?utm_source=tuicool&utm_medium=referral