- 目的
通过python,使用秘钥,以SSH方式连接Linux服务器,并执行服务器上的shell脚本 - 代码
from time import sleep
import paramiko
ssh = paramiko.SSHClient()
def conSub():
command = "cd /tmp;srcGrep.sh -key '*****' /tmp/AB"
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
pKey = paramiko.RSAKey.from_private_key_file('******', password='******')
ssh.connect(hostname='*****', port='**', username='****', password='****',pkey=pKey)
stdin, stdout, stderr = ssh.exec_command(command)
result = stdout.read()
resultFile = str(result).split('srcGrepResult.')[1][:14]
print(resultFile)
stdin2, stdout2, stderr2 = ssh.exec_command(result)
stdout2.read()
command3 = 'copySource srcGrepResult.{}'.format(resultFile)
download(command3)
print(result)
print(str(result)[2:len(str(result))-3])
print(stdout2.read())
def download(command3):
ssh.exec_command(str(command3))
if __name__ == '__main__':
conSub()
- 总结
如果连接sub目的为执行多条相关语句(即后续语句需要用到前面语句的执行结果【非返回值】),需要sleep一定时间或者空调用一次返回值。
在本次的例子中表现为三条comment,第一条通过shell生成查询过程(同时定义了查询结果文件名),第二条执行查询过程,第三条通过查询过程生成的文件下载source。由于第一次的comment的返回值中已经定义了文件名,所以第三条comment仅仅只是调用了第一条comment的返回值,并没有等待第二条comment的执行完成,这样会导致命令的空执行(即文件未写入完成就执行了操作),down下来的source会为空。
空调用一次返回值即可保证comment3一定在comment2执行结束后执行,避免comment的空执行