[英]python shell command - why won't it work?
我想知道是否有人对此有任何见解。 我有一个bash脚本,应该将ssh密钥放到远程计算机上。 从这里采用,脚本显示为
#!/usr/bin/sh
REMOTEHOST=user@remote
KEY="$HOME/.ssh/id_rsa.pub"
KEYCODE=`cat $KEY`
ssh -q $REMOTEHOST "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo "$KEYCODE" >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"
这可行。 等效的python脚本应为
#!/usr/bin/python
import os
os.system('ssh -q %(REMOTEHOST)s "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo "%(KEYCODE)s" >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"' %
{'REMOTEHOST':'user@remote',
'KEYCODE':open(os.path.join(os.environ['HOME'],
'.ssh/id_rsa.pub'),'r').read()})
但是在这种情况下,我明白了
sh: line 1: >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys: No
such file or directory
我究竟做错了什么? 我尝试转义最内层的引号但出现相同的错误消息...预先感谢您的答复。
您有一个严重的问题- os.system
的行为不符合您的预期,但您也应该认真地重新考虑整个方法。
您正在启动Python解释器-但是,然后通过os.system
,告诉Python解释器启动一个shell! os.system
根本不应该在现代Python中使用( subprocess
os.system
是一个完整的替代品)...但是在这种用例中,使用任何启动shell实例的Python调用都非常愚蠢。
现在,从实际的直接问题出发-查看引号是如何嵌套的。 您会看到在echo
中关闭mkdir
之前,您正在开始的引号允许您将命令拆分到您不希望使用的位置。
以下代码解决了此紧迫的问题,但仍然很糟糕(不必要地启动子shell,不能正确检查输出状态,应将其转换为使用subprocess.Popen()
):
os.system('''ssh -q %(REMOTEHOST)s "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo '%(KEYCODE)s' >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"''' % {
'REMOTEHOST':'user@remote',
'KEYCODE':open(os.path.join(os.environ['HOME'], '.ssh/id_rsa.pub'),'r').read()
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.