我将Python程序sshs放入另一个EC2框中,并运行bash脚本。但是,只有在登录后位于默认目录中时,它才会运行bash脚本。这是一些代码。
import boto3
import botocore
import paramiko
s3_client = boto3.client('s3')
s3_client.download_file('mybucket','keys/mykey.pem', '/tmp/mykey.pem')
k = paramiko.RSAKey.from_private_key_file('/tmp/mykey.pem')
c = paramiko.SSHClient()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
print "Connecting to Box"
c.connect( hostname = '99.99.9999', username = 'centos',pkey = k )
print "Connected to Matching Box"
commands = [
"cd /dir1/dir2/dir3/", #<- This isn't working
"pwd",
"chmod +x file.sh",
"nohup ./file.sh > logs/myprogram"
]
for command in commands:
print "Executing {}".format(command)
stdin , stdout, stderr = c.exec_command(command)
print stdout.read()
print stderr.read()
quit() #use return when putting on the handler
{
'message' : "Script execution completed. See Cloudwatch logs for complete output"
}
问题是没有更改目录。 PWD不断返回默认值,然后显然由于我的bash脚本不存在而引发错误消息。这是一个Centos构建的EC2实例,不确定是否很重要。如果我正常登录并运行相同的更改目录命令,则它可以100%运行。不知道我在做什么错。
答案 0 :(得分:1)
来自http://docs.paramiko.org/en/2.4/api/client.html#paramiko.client.SSHClient.exec_command:
/remind #random "yada yada https://www.gebruikercentraal.nl/events.ics." every 3 months
如果正常登录,则所有4条命令将在同一通道中执行,因此A new Channel is opened and the requested command is executed.
生效。但是,当您在cd
的循环中执行它们时,会生成并销毁4个通道(可能是4个exec_command()
进程),因此bash
不会持久。
$PWD
这可以解决问题。