通过 Python subprocess.Popen 将带空格的主机密钥传递给 WinSCP

Passing hostkey with spaces to WinSCP via Python subprocess.Popen

作为更大任务的一部分,我想移动一些文件,处理它们并将新文件 return 传送到 sftp 服务器。由于对我施加的限制,我只能使用 Python 3.4,这使我无法使用 Paramiko 和 pysftp 等任何漂亮而奇特的模块。

连接到服务器失败,根据 stdout 管道主机密钥不正确。 returned 的“不正确”密钥与传递给函数的密钥不同。它有一个额外的前导反斜杠并被缩短。最初传递的密钥是"ssh-XXXXXXX 256 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"。 “不正确”的键是 "\ssh-XXXXXXX"。 假设是,subprocess.Popen 以某种方式破坏了字符串。

代码如下:

array_to_be_joined = ['path/WinSCP.com',
    '/ini=nul',
    '/command',
    'open sftp://sessionURL/ -hostkey="{}" -passphrase={} -privatekey=path/privatekey.ppk'.format(hostkey,passphrase),
    'echo helloWorld']

process = subprocess.Popen(
    array_to_be_joined,
    stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.PIPE)

我尝试过的事情:

我附上了输出图片,请原谅德国人。它翻译成:

Looking for remote computer...
Connecting to remote computer...
Authenticating...
Hostkey does not match konfigured key "\ssh-XXXXXXX"!
Server Key-Fingerprint is ssh-XXXXXXX 256 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Sign-up failed.

如有任何帮助,我将不胜感激。另一种方法是编写和调用 shell 脚本,但在较大的代码中实现起来会很麻烦和笨拙。 谢谢你的时间。

我相信

只需自己格式化命令行,而不是让 Popen 为您做(错误地):

command = ' '.join(f'"{w}"' for w in array_to_be_joined)

另见


另一个选项是以 whitespace-less 格式作为会话 URL 的一部分传递指纹:
https://winscp.net/eng/docs/session_url#hostkey