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

hat*_*rix 1 python shell

我想知道是否有人对此有任何见解.我有一个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"
Run Code Online (Sandbox Code Playgroud)

这有效.等效的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()})
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我明白了

sh: line 1:  >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys: No
such file or directory
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我试图逃避最内层的引用,但同样的错误信息...提前感谢您的回复.

Cha*_*ffy 5

你有一个严肃的问题 - 那os.system就是你没有按照你期望的方式行事 - 但是,你应该认真地重新思考这个方法.

你正在启动一个Python解释器 - 然后,通过os.system告诉Python解释器启动一个shell!os.system在现代Python中根本不应该使用它(subprocess完全替代)...但是在这种用例中使用任何启动shell实例的Python调用都是非常愚蠢的.

现在,就实际的,直接的问题而言 - 看看你的引号是如何嵌套的.您将看到之前启动的引用mkdir正在关闭echo,允许您将命令拆分到您不想要的位置.

以下修复了这个直接问题,但仍然非常糟糕(不必要地启动子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()
})
Run Code Online (Sandbox Code Playgroud)