【问题标题】:How do I pass python variables to subprocess call to sed?如何将 python 变量传递给对 sed 的子进程调用?
【发布时间】:2018-12-17 13:55:53
【问题描述】:

我正在尝试向 sed 发送调用,但它似乎没有处理变量,当我打印它时它看起来正确,但在调用中却不正确

#!/usr/bin/python -tt
import json
from pprint import pprint
from subprocess import call


with open('admin_list.json') as data_file:    
    admins = json.load(data_file)

#pprint(data[0]["key"])
for admin in admins:
    #print(admin["name"])
    #print (" sudo sed, 1 a  ${"+admin['key']+"} /home/"+admin['name']+"/.ssh/authorized_keys")
    call(["sudo sed", "1 a  ${"+admin['key']+"} /home/"+admin['name']+"/.ssh/authorized_keys"])

OSError: [Errno 2] 没有这样的文件或目录"

我已经更新了我的代码我没有收到错误但文件仍然没有更新

#!/usr/bin/python -tt
import json
import os
from pprint import pprint
from subprocess import call


with open('admin_list.json') as data_file:    
    admins = json.load(data_file)

#pprint(data[0]["key"])
for admin in admins:

    call(["sudo","sed", "1 a "+admin['key']+"","/home/"+admin['name']+"/.ssh/authorized_keys"])
    call(['cat','/home/'+admin["name"]+'/.ssh/authorized_keys'])

【问题讨论】:

  • 使用sudo修改别人的ssh配置听起来是个坏主意。
  • 那么向服务器添加新管理员的最佳实践是什么,我正在尝试自动设置新服务器并在创建用户后自动将管理员的公钥添加到他们的授权密钥中
  • 我会使用Ansible 之类的工具或其他专门为该任务构建的工具。

标签: python bash sed


【解决方案1】:

您必须正确拆分参数,否则空格将按字面意思解释

这里有 4 个参数:

  • 须藤
  • sed
  • sed 的参数
  • 以管理员身份解析的文件

并且不要依赖环境。变量,事先评估它们(否则你需要shell=True

所以将 4 项列表传递给 call

call(["sudo","sed", "1 a  "+os.getenv(admin['key']),"/home/"+admin['name']+"/.ssh/authorized_keys"])

请注意,要就地修改文件,您需要将-i 选项添加到sed

call(["sudo","sed", "-i", "1 a  "+os.getenv(admin['key']),"/home/"+admin['name']+"/.ssh/authorized_keys"])

【讨论】:

  • 谢谢,我将它从 shell 脚本转换为 python 脚本,这样我就可以从 json 文件中读取管理员列表,并拥有一个管理员列表,其中包含要添加到他们的授权密钥文件中的公钥
  • os.getenv 在这里做什么?
  • 我得到一个 TypeError: cannot concatenate 'str' and 'NoneType' objects
  • getenv 用于评估您的环境。多变的。否则不予评价。而且文件没有更新,因为,好吧,你没有使用sed-i 选项(我们怎么知道你想更新文件?)
  • 您将i sed 命令与-i inplace 命令行option 混淆了
猜你喜欢
  • 2021-06-13
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多