繁体   English   中英

python shell命令-为什么不起作用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM