Как я могу вставить пробелы внутри команды echo, если обычные методы не работают - PullRequest
1 голос
/ 16 июня 2020

Привет, я новичок в linux / bash в целом, и у меня возникли проблемы с написанием скрипта для моего коллеги. Идея этого сценария - помочь автоматизировать записи в таблице IP-адресов коллег (я не использую таблицы IP-адресов, поэтому не знаю, как это работает, просто работая в соответствии с его инструкциями). Программа задаст несколько вопросов, сформирует запись и затем добавит ее в файл на другом хосте. После того, как файл будет записан, он также запустит «systemctl reload iptables.service» и «systemctl status iptables». Я проверил, что pwd по крайней мере работает там, где я планировал их разместить.

Код работал нормально с одним словом вместо переменной table_entry, я смог записать что-то в файл на моем хост-компьютере с помощью другой пользователь.

Проблема в том, что в переменной table_entry будут пробелы, а команда sudo su - c получает второе слово в качестве ввода (по крайней мере, это то, что я думаю), и я получить ошибку sudo: INPUT: команда не найдена."INPUT" из моего предложения case

Я пытался поместить переменную "table_entry" в "{$ table_entry}", " формы $ table_entry "и {$ table_entry}, но они не работали.

Я удалил часть кода, чтобы сделать его более читабельным (в основном предложения для переменных и запросы имени хоста и пользователя).

#!/bin/bash
echo -e "Which ports?
1. INPUT
2. OUTPUT
3. Forward"
read opt_ch

case $opt_ch in
 1) chain="INPUT" ;;
 2) chain="OUTPUT" ;;
 3) chain="FORWARD" ;;
 *) echo -e "Wrong Option Selected!!!"
esac

table_entry="-A $chain "#-s $ip_source -d $ip_dest

ssh -t user@host "sudo table_entry=$table_entry su -c 'echo $table_entry >> /home/user/y.txt'"
                  #^ this line will later also include the systemctl commands separated with ";" ^

Я протестировал несколько разных методов, как сделать этот скрипт в целом, heredo c (не получал ввода, чтобы работать очень хорошо), Ansible (На самом деле мне не показалось, что это отличный инструмент для этого j ob), Python (невозможно установить новые модули в среду). Так что это лучшее решение, которое я придумал с моим ограниченным набором навыков.

Редактировать: Я также понимаю, что это, вероятно, не самый умный способ сделать этот сценарий, но это единственный способ, который мне удалось проработать так далеко , который также может запрашивать пароль у пользователя при выполнении команды su. Я не разбираюсь в безопасной передаче паролей в среде linux или в целом, поэтому я предпочитаю позволять linux обрабатывать пароли за меня.

Ответы [ 2 ]

1 голос
/ 16 июня 2020
• 1000 1004 *

Мне кажется, что table_entry='$table_entry' избыточно, но это должно работать:

ssh -t user@host "sudo su -c 'echo \"$table_entry\" >> /home/user/y.txt'"
0 голосов
/ 16 июня 2020

Ваш комментарий (обозначенный #) объединяется со строкой table_entry, которую вы пытаетесь сформировать. Попробуйте добавить такой пробел:

table_entry="-A $chain " #-s $ip_source -d $ip_dest

Тогда table_entry будет назначен правильно. Я использовал KWrite для редактирования вашего bash скрипта, и он выделяет текст, который быстро показал мне проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...