EC2 SSH'ing в другой SSH и запуск скрипта bash

1

У меня есть программа 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
    Как насчет объединения всех команд в одну строку, например, cd /dir1/dir2/dir3/; pwd; chmod ... ? Не то чтобы я знал точную причину, только дикое предположение, которое могло бы помочь с отладкой.
  • 0
    Эй, это лучше, чем где я сейчас. Я попробую и доложу.
Показать ещё 3 комментария
Теги:
amazon-ec2

1 ответ

1
Лучший ответ

Из 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)

Это сделает трюк.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню