Bash программирование с функциями файловой системы - PullRequest
1 голос
/ 30 сентября 2011

Я был занят на этой неделе, пытаясь обернуть голову вокруг маленькой программы Bash для переноса CMS с одного сервера на другой. Причина этого заключается в том, что у меня есть более 40 из них, и мне нужно сделать это своевременно, таким образом, идея Bash.

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

Нет, я попробовал несколько методов, и ни один из них, похоже, не работает. Подвох в том, что я должен проверить папку на удаленном сервере через ssh. Вот мой пример:

ExSshRsa=~/.ssh/id_rsa
ExSshPort=22
ExSshHost=localhost
ExRoot=/var/www/
echo -n "Verifying Root access $ExRoot..."
SSHRoot='ssh -i $ExSshRsa -p $ExSshPort $ExSshHost [ -d $ExRoot ] || exit 1 '
echo $SSHRoot 
if [ "$SSHRoot" -eq 0 ]
    then
        echo "OK"
    else
        echo "FAIL"
fi

Я получаю сообщение об ошибке: [:: ожидается целочисленное выражение

[или тест не перезапускает 0, который является числовым.

Ответы [ 4 ]

1 голос
/ 30 сентября 2011

Попробуйте следующее:

ExSshRsa=~/.ssh/id_rsa
ExSshPort=22
ExSshHost=localhost
ExRoot=/var/www/
echo -n "Verifying Root access $ExRoot..."
cmd="bash -c \"[ -d $ExRoot ] || exit 1\""
SSHRoot="ssh -i $ExSshRsa -p $ExSshPort $ExSshHost ${cmd}"
$SSHRoot 
if [ $? -eq 0 ]
    then
        echo "OK"
    else
        echo "FAIL"
fi

Переменные не были заменены в вашей переменной SSHRoot, так как она заключена в одинарные кавычки.Кроме того, вы не передавали исполняемую команду, поэтому я использую bash -c выше.Он будет запускать команды bash внутри строки в кавычках.

$? хранит значение выхода последней команды, в данном случае SSHRoot one.

1 голос
/ 30 сентября 2011

Передача строк в качестве аргументов на удаленный хост не является тривиальной;вам нужно использовать массивы .Тестовый пример:

declare -a cmd=(touch "file name with spaces")
printf -v escaped_cmd_str '%q ' "${cmd[@]}"
ssh localhost $escaped_cmd
ssh localhost ls # Should return "file name with spaces" on a separate line

Таким образом, ваш случай должен быть:

ExSshRsa=~/.ssh/id_rsa
ExSshPort=22
ExSshHost=localhost
ExRoot=/var/www/
echo -n "Verifying Root access $ExRoot..."

declare -a cmd=( '[' -d "$ExRoot" ']' ) # Need to quote "[" since it's a Bash-specific symbol
printf -v escaped_cmd_str '%q ' "${cmd[@]}"

if ssh -i "$ExSshRsa" -p "$ExSshPort" "$ExSshHost" $escaped_cmd
then
    echo "OK"
else
    echo "FAIL"
fi

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

1 голос
/ 30 сентября 2011

измените shebang на #!/bin/bash -x и посмотрите на вывод ...

  1. вы храните строку в переменной SSHRoot, используя одинарные кавычки, то есть переменные не будутрасширенный, то есть $ - это еще $.Вместо этого используйте двойные кавычки, то есть "

  2. , чтобы сохранить выходные данные команды в bash, используйте

    var = $ (cmd)

  3. существующий статус команды сохраняется в переменной $?.Проверьте, что после команды ssh

  4. вы никогда не выполняете команду ssh в своем коде

Отличная ссылка здесь для bash-программирования

0 голосов
/ 04 октября 2011
#!/bin/bash
ExSshRsa=~/.ssh/id_rsa
ExSshPort=22
ExSshHost=localhost
ExBase='/tmp/'
ExRoot='one space/'
declare -a AExRoot
for argR in "${ExRoot[@]}"
    do
        ExRoot+=($(printf %q "$argR"))
    done
clear
FRoot=( $ExBase${ExRoot[@]} )
echo -n "Verifying Root access $FRoot..."
SSHRootTest="bash -c \"[ -d $FRoot ] && echo 0 && exit 0 || echo 1 && exit 1\""
SSHRoot=$( ssh -i $ExSshRsa -p $ExSshPort $ExSshHost ${SSHRootTest})
if [ $? -eq 0 ]
    then
        echo -en "\e[1;32mOK\e[0;37;m..."
    else
        echo -en "\e[1;31mFAIL\e[0;37;m..."
fi
sleep 1
if [ -w $FRoot ]
    then 
        echo -e "\e[1;32mwritable\e[0;37;m"
    else 
        echo -e "\e[1;31mNOT writeable\e[0;37;m"
fi
echo -e "\e[0;m"
exit 0

Итак, я включил все предложения и у меня есть еще одна проблема: FRoot не заполняется полными значениями массива.Кроме этого, я думаю, что теперь у него есть субъективный подход, как предложено @ john-keyes, правильное расширение @frederik и сумасшедшие космические побеги @ l0b0

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