bash - экранировать переменную команду SSH без изменения - PullRequest
0 голосов
/ 02 сентября 2018

Я запускаю команду в сценарии bash, которая использует содержимое файла в качестве аргумента. Вот упрощенный пример:

USER=$(<$fileA)
PASSWORD=$(<$fileB)
wget -u $USER -p $PASSWORD

Однако содержимое файла может быть установлено любым значением пользователем. Я предполагаю, что мне нужно избежать этого, но я не знаю, как это сделать, особенно таким образом, что $ PASSWORD НЕ будет изменен. В противном случае пароль, очевидно, не будет работать.

Спасибо

1 Ответ

0 голосов
/ 02 сентября 2018

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

wget -u "$USER" -p "$PASSWORD"

Если вам выпало перехватить новую строку в конце переменной, вы можете удалить ее с помощью:

wget -u "${USER%$'\n'}" -p "${PASSWORD%$'\n'}"

Синтаксис ${var} эквивалентен $var, но фигурные скобки позволяют манипулировать переменными с помощью bash. Добавляя %$'\n' перед конечной фигурной скобкой, % означает удаление текста $'\n', что означает удаление завершающего символа новой строки, если таковой имеется.

В худшем случае вы можете получить перевод строки и возврат каретки (возможно, если файлы были сгенерированы текстовым редактором в Windows), но вы также можете справиться с этим:

wget -u "${USER%%[$'\n'$'\r']*}" -p "${PASSWORD%%[$'\n'$'\r']*}"

На этот раз искомый текст - [$'\n'$'\r']*, что означает «первая новая строка (\n) или возврат каретки (\r) и все после», а оператор %% означает «удалить самую длинную последовательность» в конце ".

...