通过 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
以某种方式破坏了字符串。
- 主机密钥、密码和私钥都是必需的
- 主机密钥已由服务器直接生成并匹配由标准输出管道return输入的指纹
- 连接在 windows shell 中完成时有效,但需要在 python 中实现。
- 当通过使用
*
接受任何给定密钥时连接有效,但这显然是不安全的,因此不可行。
代码如下:
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)
我尝试过的事情:
把参数写在subprocess.Popen
函数里
将参数写入一个列表,并将列表传递给函数
通过string.format
在变量中传递了主机密钥
以明文形式传递了主机密钥
尝试了主机密钥:
- 单引号
- 单引号用
\
转义
- 单引号用
`
转义
- 两个单引号
- 两个单引号用
\
转义
- 两个单引号用
`
转义
- 双引号
- 双引号转义
\
- 双引号转义
`
- 两个双引号
- 两个双引号用
\
转义
- 两个双引号用
`
转义
- 没有引号
我附上了输出图片,请原谅德国人。它翻译成:
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
作为更大任务的一部分,我想移动一些文件,处理它们并将新文件 return 传送到 sftp 服务器。由于对我施加的限制,我只能使用 Python 3.4,这使我无法使用 Paramiko 和 pysftp 等任何漂亮而奇特的模块。
连接到服务器失败,根据 stdout 管道主机密钥不正确。 returned 的“不正确”密钥与传递给函数的密钥不同。它有一个额外的前导反斜杠并被缩短。最初传递的密钥是"ssh-XXXXXXX 256 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
。 “不正确”的键是 "\ssh-XXXXXXX"
。
假设是,subprocess.Popen
以某种方式破坏了字符串。
- 主机密钥、密码和私钥都是必需的
- 主机密钥已由服务器直接生成并匹配由标准输出管道return输入的指纹
- 连接在 windows shell 中完成时有效,但需要在 python 中实现。
- 当通过使用
*
接受任何给定密钥时连接有效,但这显然是不安全的,因此不可行。
代码如下:
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)
我尝试过的事情:
把参数写在
subprocess.Popen
函数里将参数写入一个列表,并将列表传递给函数
通过
在变量中传递了主机密钥string.format
以明文形式传递了主机密钥
尝试了主机密钥:
- 单引号
- 单引号用
\
转义
- 单引号用
`
转义
- 两个单引号
- 两个单引号用
\
转义
- 两个单引号用
`
转义
- 双引号
- 双引号转义
\
- 双引号转义
`
- 两个双引号
- 两个双引号用
\
转义
- 两个双引号用
`
转义
- 没有引号
我附上了输出图片,请原谅德国人。它翻译成:
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