使用python变量执行shell命令

时间:2017-11-15 13:14:47

标签: python subprocess

我在bash上有脚本,我为用户生成了用户名,密码和ssh-key。 创建ssh-key的部分:

su $user -c "ssh-keygen -f /home/$user/.ssh/id_rsa -t rsa -b 4096 -N ''"

如何使用os.system在Python中执行相同的操作?我试过这个:

os.system('su %s -c "ssh-keygen -f /home/%s/.ssh/id_rsa -t rsa -b 4096 -N ''"', user)
TypeError: system() takes at most 1 argument (2 given)

我也试过了:

os.system('su user -c "ssh-keygen -f /home/user/.ssh/id_rsa -t rsa -b 4096 -N ''"')

当然,它也不起作用。

3 个答案:

答案 0 :(得分:1)

使用os包格式化您的说明;例如:

import os

user = 'joe'
ssh_dir = "/home/{}/.ssh/id_rsa".format(user)
os.system("ssh-keygen -f {} -t rsa -b 4096 -N ''".format(ssh_dir))

答案 1 :(得分:1)

使用子流程模块:

import subprocess
username = 'user'
result, err = subprocess.Popen(
            'su %s -c "ssh-keygen -f /home/%s/.ssh/id_rsa -t rsa -b 4096 -N ''"' % (username, username),
            stdout=subprocess.PIPE,
            shell=True
          ).communicate()
if err:
    print('Something went wrong')
else:
    print(result)

编辑:这是'快速'要做到这一点,如果您无法控制输入,则不应使用shell=True,因为它允许执行代码here

答案 2 :(得分:1)

os.system非常靠近bash命令行,因为它使用了底层shell(就像它的堂兄subprocess.call ...使用shell=True

在你的情况下,使用subprocess没有什么兴趣,因为你的命令运行命令,所以你不能真正完全使用subprocess的参数保护。​​

传递确切的命令,但唯一的变化是保护简单的引号,否则python认为字符串结束+字符串开始(你的字符串已经被简单的引号保护)并且它们被消除了。

检查这个更简单的例子:

>>> 'hello '' world'
'hello  world'
>>> 'hello \'\' world'
"hello '' world"

这是一种最糟糕的情况,因为你不能使用双重或简单的引号来保护字符串,因为你正在使用其他的味道。在这种情况下,使用\

来转义引号
os.system('su $user -c "ssh-keygen -f /home/$user/.ssh/id_rsa -t rsa -b 4096 -N \'\'"')