Команда Sed считается строкой - Как убежать? - PullRequest
0 голосов
/ 12 июня 2018

У меня есть команда sed, которую мне нужно выполнить через SSH.Я пишу на Python, используя Paramiko для SSH.Соединение работает и команда 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, char 11: неопределенная команда `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"))

1 Ответ

0 голосов
/ 12 июня 2018

Ваш код довольно неясен. определенно определенно не нужно запускать вложенные sudo команды, и для одной команды его перенос в sudo bash -c ничего не дает и не создает лишних процессов и значительно повышает уровень безопасности, а также значительныйпроблемы цитирования.

Вероятно, вашу непосредственную проблему легче всего решить, используя одинарные кавычки вместо двойных кавычек вокруг сценария sed и избавившись от лишних sudo bash -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 должен быть одной строкой;пара одинарных кавычек предотвращает разрушение оболочки и токенизацию или иное изменение текста между одинарными кавычками.В основном вы всегда должны использовать одинарные кавычки, если вам не нужна оболочка для интерполяции переменных и / или подстановок команд в строке.

...