paramiko踩坑

paramiko踩坑:远程上传下载以及linux命令执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import paramiko
import parse_config
import pysvn
tran = paramiko.Transport('XXX')
tran.connect(username='XXX', password="XXX")
# 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)

local_excel = "XXX"
remotepath = "XXX"

svnclient = pysvn.Client(local_excel)
changes = svnclient.status(local_excel)
#这里是获取svn modified,我主要是获取改动的excel文件
change_exc = [f.path for f in changes if f.text_status == pysvn.wc_status_kind.modified]

#我自己做的一些其他处理,可不管
parconf = parse_config.parsetable
need_parese = []
for i in change_exc:
xls_name = i.split("文档\\")[1].replace('\\', '/')
print(xls_name)
targetpath = remotepath + xls_name
localpath = i.replace('\\', '/')
# print("本地位置----", localpath, "目标位置----", targetpath)
sftp.put(localpath, targetpath)
parse_file = "文档\\" + xls_name
for k, v in parconf.items():
for ls in v:
if ls["parse_file"] == parse_file:
need_parese.append(k)
break
print(need_parese)
tran.close()

# 配置私人密钥文件位置
# private = paramiko.RSAKey.from_private_key_file('D:/dev_rsa/id_rsa_2048', password='123456')
# 实例化SSHClient
client = paramiko.SSHClient()

# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#
# 连接SSH服务端,以用户名和密码进行认证
client.connect(hostname='1XXX', username='XXX', password="XXX")

# parse_com = "./tools/parse_local_table.py"
parse_com = "git branch"
for k in need_parese:
parse_com = parse_com + " " + k

# stdin1, stdout1, stderr1 = client.exec_command('cd qqsj_qc01/logic/;./tools/parse_local_table.py activity_theme')
cmd = "bash --login -c 'cd qqsj_qc01/logic/;{}'".format(parse_com)
print(cmd)
print("--------------开始执行导表----------------")
stdin1, stdout1, stderr1 = client.exec_command(cmd, get_pty=True)

print(stdout1.read().decode('utf-8'))
client.close()


# 执行上传下载动作
# sftp.put(i, remotepath)
# sftp.get(remote_parseconfig, local_parseconfig)

  • 踩坑点1:远程Linux命令执行,会出现command Not found,因为执行的path不对。必须采用bash –login登陆方式(这个方式表示用户登陆时,输入用户名和密码后启动的shell)。
  • 踩坑点2:执行命令要一并执行,中间用,分割,否则不是同一个会话。如果分开执行client.exec_command(cd home/my)和client.exec_command(ls),最后列出目录并不是my下面文件

Bash 的激活选项
-c string 该选项表明string中包含了一条命令.如 bash -c ls ~;bash –login -c ‘cd /home/my,ls’
-i 使Bash以交互式方式运行
-r 使Bash以受限方式运行
–login 使Bash以登录Shell方式运行
–posix 使Bash遵循POSIX标准
–verbose 使Bash显示所有其读入的输入行
–help 打印Bash的使用信息
–version 打印版本信息
–noprofile
–norc
–rcfile file


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!