标签:直接 timeout miss set hosts 打印 int 上传 代码
客户端实现有三种方式:
1:用账号密码登陆
1.1直接使用SSHClient对象的exec_command()在服务端执行命令:
代码实现:
import paramiko
import sys
def Usage():
print "[Usage]./SSH_Client.py ip port command"
try:
ip=sys.argv[1]
port=int(sys.argv[2])
command=sys.argv[3]
except:
Usage()
user="root"
passwd="root"
#实例化SSHClient
client=paramiko.SSHClient()
#自动添加策略,保存服务器的主机名和密钥信息
#用ssh连接远程主机时,第一次连接时会提示是否继续进行远程连接,选择yes 这句话会自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端,以用户名和密码进行认证
client.connect(ip,port,username=user,password=passwd)
#打开一个Channel 并执行命令
stdin,stdout,stderr=client.exec_command(command)
#打印执行结果 若有错误 stderr.read()就不为空
if stderr.read()=="":
for i in stdout.readlines():
print i
client.close()
1.2实例化SSHClient的对象再得到一个Transport对象,以Transport对象的exec_command()在服务端执行命令
import sys
import paramiko
def Usage():
print "[Usage]./SSH_Client.py ip port command"
try:
ip=sys.argv[1]
port=int(sys.argv[2])
command=sys.argv[3]
except:
Usage()
# reload(sys)
# sys.setdefaultencoding(‘utf-8‘)
user="root"
passwd="root"
#实例化SSHClient
client=paramiko.SSHClient()
#自动添加策略,保存服务器的主机名和密钥信息
#用ssh连接远程主机时,第一次连接时会提示是否继续进行远程连接,选择yes 这句话会自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端,以用户名和密码进行认证
client.connect(ip,port,username=user,password=passwd)
#实例化Transport 建立session会话
ssh_session=client.get_transport().open_session()
if ssh_session.active:
ssh_session.exec_command(command)
print ssh_session.recv(4096)
client.close()
2:用密钥进行登陆
import paramiko
import sys
def Usage():
print "[Usage]./SSH_Client.py ip port command"
try:
ip=sys.argv[1]
port=int(sys.argv[2])
command=sys.argv[3]
except:
Usage()
user="root"
#实例化SSHClient
client=paramiko.SSHClient()
#指定用来解密的私钥的路径,需要手动生成
pkey_file = ‘/home/.ssh/id_rsa‘
#使用私钥解密
key = paramiko.RSAKey.from_private_key_file(pkey_file)
#load_system_host_keys用于指定对方主机存放本机公钥的位置,默认不加参数的话是将这个位置设置为~/.ssh/known_hosts
client.load_system_host_keys()
#自动添加策略,保存服务器的主机名和密钥信息
#用ssh连接远程主机时,第一次连接时会提示是否继续进行远程连接,选择yes 这句话会自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端,以用户名和密码进行认证
client.connect(ip,port,username=user,key_filename=key,timeout=6)
#打开一个Channel 并执行命令
stdin,stdout,stderr=client.exec_comment(command)
#打印执行结果 若有错误 stderr.read()就不为空
if stderr.read()=="":
print stdout.readlines()
client.close()
实现上传下载:
import paramiko
#获取Transport实例 参数为tuple
tran = paramiko.Transport(("192.168.72.130",22))
#连接SSH服务端
tran.connect(username ="root", password ="root")
#获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
#设置上传的本地/远程文件路径
#执行上传动作
sftp.put("C:/7.der","/tmp/7.der")
sftp.get(‘/root/test.py‘,‘F:/test.py‘)
tran.close()
实现过程中出现的问题:
import paramiko时出现UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe9 in position 0: ordinal not in range(128) 错误
解决办法:在python 安装路径下Lib\site.py 添加如下代码:
import sys
reload(sys)
sys.setdefaultencoding(‘gbk‘)
经过测试 设置编码为utf-8还是导入不成功 设置为gbk可以成功导入
登陆所要的密钥需要手动生成:可以参考
http://blog.sina.com.cn/s/blog_7ae2408501018xsj.html
http://blog.csdn.net/fdipzone/article/details/47327183
标签:直接 timeout miss set hosts 打印 int 上传 代码
原文地址:http://www.cnblogs.com/arongmh/p/7536437.html