Python Paramiko "exec_command" не выполняется - Django

Я столкнулся с проблемой библиотеки Python Paramiko в моем Django приложении

Это функция, которую я написал для создания SFTP соединения:

def createSFTPConnection(request,temp_pwd):
    ssh=paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    user = User.objects.get(username=request.user)
    ssh.connect(hostname=temp_host,username=user.username,password=temp_pwd,port=22)
    sftp_client=ssh.open_sftp()

    return ssh,user,sftp_client

Это просто возвращает мне переменную для ssh, имя пользователя и sftp_client

Затем я выполняю команду на удаленном сервере, используя этот код -

ssh,user,sftp_client=createSFTPConnection(request,temp_pwd)  # passes the password on that server for the user for creating the connection

cmd_to_execute="(cd "+temporary_path+"; sh temp.sh"+" "+var1+" "+var2+")" # executing a shell script by passing it 2 variables

stdin, stdout, stderr = ssh.exec_command(cmd_to_execute) # actual call
print("stderr: ", stderr.readlines())
print("pwd: ", stdout.readlines())

Теперь этот код работает нормально и выполняет сценарий "temp.sh" на удаленном сервере, но это занимает много времени, поскольку я возвращаю stdin, stdout и stderr и печатаю их на консоли

Но, поскольку мне это не нужно, я удалил оттуда вызовы readlines(), в результате чего мой код выглядит следующим образом -

cmd_to_execute="(cd "+temporary_path+"; sh temp.sh"+" "+var1+" "+var2+")" 
stdin, stdout, stderr = ssh.exec_command(cmd_to_execute) # actual call

Но по какой-то причине этот код просто не выполняется на удаленном сервере после удаления readlines() вызовов

Таким образом, заставляя меня думать, что exec_command не работает без предварительного вызова readlines()

И я не знаю, почему это происходит...

Любая помощь будет очень признательна!!! Спасибо!!!

Для вашей информации - Это код Django после вызовов readlines() -

usr_msg="Your file has been uploaded successfully!! This is your variable: "+var1
messages.success(request, usr_msg)
ssh.close()
sftp_client.close()
return redirect("/execute/all")

<1>> только начинает выполнение команды. Если вы не дождетесь ее завершения и сразу же убьете сессию, команда будет убита вместе с ней.SSHClient.exec_command

Если вы хотите, чтобы команда выполнялась даже после отключения, вам нужно отсоединить ее от сессии.

Смотрите Запуск процесса удаленного SSH-сервера в фоновом режиме с помощью Python Paramiko

Вернуться на верх