У меня есть программа 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%. Не уверен, что я делаю неправильно.
Из http://docs.paramiko.org/en/2.4/api/client.html#paramiko.client.SSHClient.exec_command: A new Channel is opened and the requested command is executed.
Если вы входите в систему, все 4 команды будут исполняться в одном канале, поэтому cd
вступает в силу. Но когда вы выполняете их в цикле exec_command()
s, 4 канала, возможно, 4 процесса bash
, порождаются и уничтожаются, поэтому $PWD
не сохраняется.
command = 'cd /dir1/dir2/dir3/; pwd; chmod +x file.sh; nohup ./file.sh > logs/myprogram'
stdin, stdout, stderr = c.exec_command(command)
Это сделает трюк.
cd /dir1/dir2/dir3/; pwd; chmod ...
? Не то чтобы я знал точную причину, только дикое предположение, которое могло бы помочь с отладкой.