LINUX.ORG.RU

Как выполнить команду в Bash из переменной?

 , , ,


0

2

Проблема при выполнении следующего куска кода. Скрипт запускается от обычного текущего пользователя:

#!/bin/bash

    hostIp="192.168.150.101"
    userPwd="12345"

    echo "Настройка хоста $hostIp"

    command="sshpass -p '$userPwd' ssh-copy-id -i ~/.ssh/id_rsa.pub user@$hostIp"
    echo "Выполняется команда:"
    echo "$command"
    $command

При запуске этого когда, в консоли видим следующую ошибку:
Настройка хоста 192.168.150.101
Выполняется команда:
sshpass -p '12345' ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.150.101

/usr/bin/ssh-copy-id: ERROR: failed to open ID file '~/.ssh/id_rsa.pub': Нет такого файла или каталога

Но дело в том, что, файл открытого ключа существует. Мало того, если в консоли скопировать «сконструированную» скриптом команду, и выполнить ее:
sshpass -p '12345' ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.150.101

то эта команда выполнится без проблем, и ключ будет прописан на удаленной машине.

Вопрос: почему не выполняется команда внутри скрипта? При этом почему она нормально выполняется в консоли?

★★★★★

Похоже ~ не устраивает. Попробуй ${HOME}.

sin_a ★★★★★
()

Замени ~ на $HOME.

Тильду тебе shell раскрывает.

А внутри скрипта - это просто строка с невалидным путём получается.

Ja-Ja-Hey-Ho ★★★★
()
Ответ на: комментарий от Xintrea

Да, благодарю, в этом было дело.

Если б только. Оно у вас пароль установит не на 123456, а на '123456'

cmd="ls 'aaa'"
$cmd
ls: cannot access "'aaa'": No such file or directory
А правильно:
cmd=(ls 'aaa')
"${cmd[@]}"

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Оно у вас пароль установит не на 123456, а на '123456'

Не знаю, у меня проброс пароля через sshpass работает и с амперсандами.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Не знаю,

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

vodz ★★★★★
()
Ответ на: комментарий от vodz

передать в том числе и амперсанды, нормальный такой символ для пароля

Может быть, предполагается, что его можно передать экранируя?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Может быть, предполагается, что его можно передать экранируя?

Ну понятное же дело, что для sshpass мне лень проверять, я вам дал простой пример общего вида, доказывающий, что сама реализация задачи из названия топика путём формирования строки «cmd 'arg'» - неправильная по сути. А экранировать, когда надо это делать не по стандарту в shell - та ещё песня.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.