Как передать имя файла из переменной локально в ssh? [Дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

1
задан mrodmac 16 September 2014 в 21:04
поделиться

2 ответа

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

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

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

ssh root@192.168.0.1 '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 .

0
ответ дан Community 18 August 2018 в 04:27
поделиться
  • 1
    Это небезопасно против намеренно злонамеренных аргументов. Учитывая, что это код, вызываемый в ответ на инциденты безопасности и выполняемый с правами root, такая безопасность, вероятно, является законной проблемой. – Charles Duffy 16 September 2014 в 21:16
  • 2
    Я согласен, но мы говорим о каком-то хэб-хэш-скрипте. В любом случае, правильное решение для управления черным списком будет выглядеть по-другому. ;) – lxg 16 September 2014 в 21:17
  • 3
    Для более явного примера: рассмотрим случай, когда $1 является '"$(rm -rf /)"' (где эти внешние кавычки являются буквальным текстом, а не синтаксисом). Я предпочел бы, чтобы злоумышленник помещал мусор в named.conf, а не позволял им запускать произвольные команды на моем сервере имен. – Charles Duffy 16 September 2014 в 21:18
  • 4
    Я думаю, что ответ lxg - это то, что мне нужно. Я избежал этого щенка почти , все, что мог, за исключением ... Я не беспокоюсь о том, что named.conf редактируется другим процессом, и это быстрый способ блокировать доступ к сайтам, на которые ссылаются спам электронные письма и т. д. Thnaks! – mrodmac 16 September 2014 в 21:32
  • 5
    @mrodmac, если вы извлекаете текст из спам-писем (по определению, вредоносный контент) и загружаете этот текст в скрипт, который для некоторых значений этого текста выполняет произвольные команды с правами root , I 'd утверждают, что вы действительно можете использовать некоторую дополнительную паранойю вокруг того, как вы относитесь к безопасности. :) – Charles Duffy 16 September 2014 в 21:34

Во-первых, вы не хотите, чтобы это были два отдельно перенаправленных оператора 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 root@192.168.0.1 bash <<<"$remote_command"

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

1
ответ дан Charles Duffy 18 August 2018 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: