2017-04-11 6 views
0
import paramiko, commands 
ssh_client = paramiko.SSHClient() 
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh_client.load_system_host_keys() 
ssh_client.connect('xx.xx.x', username='abc', 
key_filename='rsa') 

line ="Hello" 
stdin, stdout, stderr=ssh_client.exec_command('echo $line') 
print stdout.readlines() 

「行」のコンテンツをエコーするにはどうすればよいですか。しかし、私は [u '\ n']を出力として得ます。ローカルエコーコマンドにローカル変数を渡すには?

私はecho \ $ line、echo "$ line"も試みました。しかし、出力としてハローにならない。

答えて

1

リモートシェルはプログラム変数にアクセスできません。コマンドは起動前に作成する必要があります。

stdin, stdout, stderr = ssh_client.exec_command('echo {}'.format(quote(line))) 
+0

ありがとう:

stdin, stdout, stderr = ssh_client.exec_command('echo "{0}"'.format(line)) 

はあなたのコードの堅牢性を高めるためにPythonの3使用shlex.quoteで、( @Tripleee 感謝)安全性の問題に注意してください。それは働いた! – vishnu

+1

二重引用符やドル記号、バッククォートを含む 'line'の値に対しては堅牢ではありません。これはそれぞれシェルによる変数補間とコマンド置換を導入します。一重引用符は後者を避けて前者を回避しますが、一重引用符を含めることはできません。完全に頑強にするには、[shlex.quote() '](/ questions/35817/how-to-escape-os-system-calls-in-pythonなど)を使用する必要があります。 – tripleee

+0

非常に良い点@トリプル、ありがとう;) – klashxx

関連する問題