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