2014-09-16 6 views
1

Когда я натыкаюсь на злой веб-сайт, который я хочу заблокировать от корпоративного доступа, я редактирую файл named.conf на моем сервере связывания, а затем обновляю свой черный файл прокси-сервера. Я хотел бы автоматизировать это с помощью сценария bash. Скажем, мой сценарий называется «evil-site-block.sh» и содержит следующее:Передача внешней переменной скрипта оболочки через ssh

ssh [email protected] 'echo "#date added $(date +%m/%d/%Y)" >> /var/named/chroot/etc/named.conf; echo "zone \"$1\" { type master; file \"/etc/zone/dummy-block\"; };" >> /var/named/chroot/etc/named.conf' 

Затем работает как

$ evil-site-block.sh google.com 

Когда я смотрю на содержание named.conf на удаленной машине я вижу:

#date added 09/16/2014 
zone "" { type master; file "/etc/zone/dummy-block"; }; 

То, что я не могу понять, как передать «google.com» в $ 1.

ответ

0

Ваша проблема: вся ваша команда помещается в одинарные кавычки - очевидно, так что выражения bash расширяются на сервере, а не локально.

Но это также относится к вашему $1.

Простое решение: «Переключить» цитату, обернув вашу локальную переменную в одинарные кавычки.

ssh [email protected] 'echo "#date added $(date +%m/%d/%Y)" >> /var/named/chroot/etc/named.conf; echo "zone \"'$1'\" { type master; file \"/etc/zone/dummy-block\"; };" >> /var/named/chroot/etc/named.conf' 

NB: \"$1\"\"'$1'\".

ПРИМЕЧАНИЕ. Это решение является простым решением для однострочного вкладыша, как указано в вопросе выше. Если есть хоть малейшая вероятность, что этот скрипт будет выполнен другими людьми или он сможет обрабатывать внешний вывод любого вида, пожалуйста, посмотрите на Charles Duffy's solution.

+0

Это небезопасно против намеренно злонамеренных аргументов. Учитывая, что это код, вызываемый в ответ на инциденты безопасности и выполняемый с правами root, такая безопасность, вероятно, является законной проблемой. –

+0

Согласен, но мы говорим о каком-то хелпер-скриптовом скрипте. В любом случае, правильное решение для управления черным списком будет выглядеть по-другому. ;) – lxg

+0

Для более явного примера: Рассмотрим случай, когда '$ 1' является' '" $ (rm -rf /) "'' (где эти внешние кавычки являются буквальным текстом, а не синтаксисом). Я предпочел бы, чтобы злоумышленник помещал мусор в named.conf, а не позволял им запускать произвольные команды на моем сервере имен. –

1

Во-первых, вы не хотим, чтобы это два отдельно перенаправлены echo заявления - делать это и неэффективно и означает, что линии могут оказаться не рядом друг с другом, если что-то другое, добавляя в то же время.

Во-вторых, и что еще более важно, вы не хотите, чтобы удаленная команда запускалась как нечто, что могло бы избежать его кавычек и запускать на вашем сервере произвольные команды (подумайте, $1 - '$(rm -rf /)'.spammer.com).

Вместо этого рассмотрим:

#!/bin/bash 
#^above is mandatory, since we use features not found in #!/bin/sh 

printf -v new_contents \ 
    '# date added %s\nzone "%s" { type master; file "/etc/zone/dummy-block"; };\n' \ 
    "$(date +%m/%d/%Y)" \ 
    "$1" 
printf -v remote_command \ 
    'echo %q >>/var/named/chroot/etc/named.conf' \ 
    "$new_contents" 
ssh [email protected] bash <<<"$remote_command" 

printf %q Escapes данные таким образом, что проход оценки в другой Баш оболочки оценит, что содержание обратно к себе. Таким образом, удаленная оболочка будет гарантирована (до тех пор, пока это bash) правильно интерпретировать контент, , даже если контент пытается избежать его окружающих котировок.

Смежные вопросы