Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Sed命令被认为是字符串-如何转义?_Python 2.7_Ssh_Sed_Paramiko - Fatal编程技术网

Python 2.7 Sed命令被认为是字符串-如何转义?

Python 2.7 Sed命令被认为是字符串-如何转义?,python-2.7,ssh,sed,paramiko,Python 2.7,Ssh,Sed,Paramiko,我有一个sed命令,需要通过SSH执行。我正在使用Paramiko对SSH进行Python编码。连接正常,sed命令也正常。我的问题是当我尝试合并它们时:我需要使用sed作为sudo(sudo命令工作,我已经用另一个命令测试了它)。以下是我所拥有的: session.exec_command("sudo bash -c \"" + """sudo sed -i "s/\"hostname\":" *"\".*\"/\"hostname\":" *"\"adddvariable\"/" /ho

我有一个sed命令,需要通过SSH执行。我正在使用Paramiko对SSH进行Python编码。连接正常,sed命令也正常。我的问题是当我尝试合并它们时:我需要使用sed作为sudo(sudo命令工作,我已经用另一个命令测试了它)。以下是我所拥有的:

session.exec_command("sudo bash -c \"" + """sudo sed -i "s/\"hostname\":"  *"\".*\"/\"hostname\":"  *"\"adddvariable\"/" /home/frappe/frappe-bench/sites/test-dev.site1.local/site_config.json""" + "\"")
问题是,当此命令运行时,sed被认为是“未完成”,我得到:

sed:-e表达式#1,字符11:unterminated's'命令

我认为这可能是由于sed命令中的空格造成的?我不知道如何解决这个问题。我对Python、Paramiko和SSH还不熟悉。有人知道如何解决这个问题吗

以下是完整的代码(如果有帮助):

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(
    hostname=server_address,
    username=server_username,
    key_filename=server_key_file
)
session = ssh.get_transport().open_session()
session.set_combine_stderr(True)
session.get_pty() 
session.exec_command("sudo bash -c \"" + """sudo sed -i "s/\"hostname\":"  *"\".*\"/\"hostname\":"  *"\"adddvariable\"/" /home/frappe/frappe-bench/sites/test-dev.site1.local/site_config.json""" + "\"")
stdin = session.makefile('wb', -1)
stdout = session.makefile('rb', -1)
stdin.flush()
frappe.msgprint(_(stdout.read().decode("utf-8"))) # same as print(stdout.read().decode("utf-8"))

你的代码相当不清楚。毫无疑问,不需要运行嵌套的
sudo
命令,对于单个命令,将其包装在
sudobash-c
中不会产生任何效果,并且会引入多余的过程和显著增加的安全性,以及显著的引用问题

通过在
sed
脚本中使用单引号而不是双引号,并去掉额外的
sudobash-c
可能最容易解决眼前的问题

session.exec_command("""sudo sed -i 's/"hostname":  *"[^"]*"/"hostname":  "adddvariable"/' /home/frappe/frappe-bench/sites/test-dev.site1.local/site_config.json""")
我不完全确定我是否能够猜出
sed
命令真正应该完成什么。这一个将JSON键/值
hostname
替换为
“hostname”:“adddvariable”
,替换旧值


sed-i
的参数应该是单个字符串;一对单引号可以防止shell拆分、标记化或以其他方式更改单引号之间的文本。如果不特别需要shell在字符串中执行变量插值和/或命令替换,那么基本上应该始终使用单引号。

是的,你说得对,我不需要bash-c之类的东西。代码不起作用,因为它和我有双引号。你救了我一天!