2012-05-24 3 views
0

Я пытаюсь установить переменную, которая использует другую переменную в Баш скрипт:Как установить переменную, которая использует другую переменную в сценарии bash?

echo "Enter server IP:" 
read serverIP 

ssh="ssh $serverIP" 

$ssh cp ... 
$ssh mv ... 
$ssh rm ... 

Однако, это не работает. Каков правильный синтаксис в этом случае?

+0

Какая ошибка? сделать эхо $ ssh. –

+0

Он просто выводит 'ssh'. У меня нет введенного IP-адреса. –

+0

Ваше задание должно работать нормально. Это проблема с исполнением переменной в качестве команды. См. [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). Зачем вам нужна команда в переменной? –

ответ

1

вы можете использовать

SERVER_IP="127.0.0.1" 
alias ssh="ssh $SERVER_IP" 

и вы хорошо идти

+0

Это, похоже, не выводит введенный IP-адрес. Если я выполняю 'echo ssh', выводится только' ssh'. –

+0

@ DanielT.Попробуйте 'echo $ ssh' с' $ ' – user123444555621

+0

BAH, спасибо Pumbaa80. Теперь это работает. –

0

Попробуйте

eval $ssh cp ... 

Я не думаю, что установка ServerIP и SSH является проблема ссылается значение.

Eval откладывает окончательное представление команды из оболочки в систему, разрешая другой проход. В первом проходе $ssh расширяется во втором и последнем (eval) проходе, теперь оболочка может видеть, что $ ssh действительно означает ssh 10.10.10.10 (например).

Eval считается злым, возможно, что пользователь может отправить правильный sytnax через переменную serverIP, которая будет выполнять /bin/rm -rf /*. Поэтому будьте осторожны, как вы его используете.

Окончательный бит мелочей, возможно, но вряд ли каждый практический, использовать больше, чем 1 eval проход по линии, то есть eval eval eval... \$${ssh} .....

Надеюсь, это поможет.

1

Если вы хотите запустить remote commands via SSH, единственный безопасный способ заключается в использовании arrays и параметр вытекающее.

Во-первых, использовать один массив для хранения команды, опции, флаги, параметры и т.д. Например:

remote_cmd=(touch -- "path with spaces") 
echo "${remote_cmd[2]}" # path with spaces 

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

for arg in "${remote_cmd[@]}" 
do 
    remote_cmd_escaped+=("$(printf %q "$arg")") 
done 
echo "${remote_cmd_escaped[2]}" # path\ with\ spaces 

Затем вы должны использовать другой массив для самой команды SSH:

ssh_cmd=(ssh "localhost" "${remote_cmd_escaped[@]}") 

Теперь вы с прогоне без проблем:

"${ssh_cmd[@]}" 

Убедитесь, что файл был создан с пробелами:

ls "$HOME/path with spaces" 

успеха!

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