BASH Скрипт передает переменную с пробелом в Heredo c? - PullRequest
0 голосов
/ 13 июля 2020

Я использую следующее:

filename="Test File 17-07-2020.xls"

sshpass -p $password ssh root@$IP /bin/bash -s "$filename" << 'EOF'

echo $1

EOF

Это работает, когда имя файла равно Testfile.xls и эхо выводит полное имя файла.

Но не удается, если имя файла называется Test File 17-07-2020.xls

Насколько я понимаю, пробелы нарушают ввод, поэтому он становится:

$1 = Test
$2 = File
$3 = 17-07-2020.xls

Есть ли способ передать это, сохраняя пробелы и имея его all in $1

Если я добавлю filename=$(echo "$filename" | sed 's/ /\\ /g') перед командой SSHPASS, это сработает.

Это правильный способ сделать это или есть лучший способ?

Спасибо

1 Ответ

1 голос
/ 13 июля 2020

Еще нужно указать $1. Использование разделителя в кавычках предотвращает преждевременное раскрытие $1; он не предотвращает разбиение слов после того, как оболочка фактически выполняет echo $1.

sshpass -p $password ssh root@$IP "/bin/bash -s \"$filename\"" << 'EOF'

echo "$1"

EOF

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

sshpass -p $password ssh root@$IP "/bin/bash -s $(printf '%q' "$filename")"

или

sshpass -p $password ssh root@$IP "/bin/bash -s ${filename@Q}"

Первый работает как минимум в bash 3.2 (я очень сомневаюсь, что вы используете старую версию), а для последнего требуется bash 4.4.

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