Тест директории удаленной файловой системы Bash - PullRequest
0 голосов
/ 05 октября 2011

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

Мне удалось выяснить, как тестировать каталоги и возможность записи, но у меня возникла проблема в ту минуту, когда я пытаюсь сделать это с удаленным сервером через ssh.Первый экземпляр, проверяющий каталог / tmp, работает нормально, но когда вызывается вторая часть, я получаю line 0: [: missing] '`

Теперь, если я заменю \" одинарной кавычкой, она работает, но я думал, что одинарные кавычки обращаются к переменным ссылкам ?? Может кто-нибудь объяснить мне это, пожалуйста? Предполагая, что каталог tmp существует и доступен для записи, вот сценарий до сих пор

#!/bin/bash
SshHost="hostname"
SshRsa="~/.ssh/id_rsa"
SshUser="user"
SshPort="22"
Base="/tmp"
Sub="one space/another space"

BaseBashExist="bash -c \"[ -d \"$Base\" ] && echo 0 && exit 0 || echo 1 && exit 1\""
SSHBaseExist=$( ssh -l $SshUser -i $SshRsa -p $SshPort $SshHost ${BaseBashExist} )
echo -n $Base
if [ $? -eq 0 ]
    then
        echo -n "...OK..."
    else
        echo "...FAIL"
        exit 1
fi
BaseBashPerm="bash -c \"[ -w \"$Base\" ] && echo 0 && exit 0 || echo 1 && exit 1\""
SSHBaseExist=$( ssh -l $SshUser -i $SshRsa -p $SshPort $SshHost ${BaseBashPerm} )
if [ $? -eq 0 ]
    then
        echo "...writeable"
    else
        echo "...not writeable"
fi

BaseAndSub="$Base/$Sub"
BaseAndSubBashExist="bash -c \"[ -d \"$BaseAndSub\" ] && echo 0 && exit 0 || echo 1 && exit 1\""
SSHBaseAndSubExist=$( ssh -l $SshUser -i $SshRsa -p $SshPort $SshHost ${BaseAndSubBashExist} )
echo -n $BaseAndSub
if [ $? -eq 0 ]
    then
        echo -n "...OK..."
    else
        echo "...FAIL"
        exit 1
fi
BaseAndSubBashPerm="bash -c \"[ -w \"$BaseAndSub\" ] && echo 0 && exit 0 || echo 1 && exit 1\""
SSHBaseAndSubPerm=$(  ssh -l $SshUser -i $SshRsa -p $SshPort $SshHost ${BaseAndSubBashPerm} )
if [ $? -eq 0 ]
    then
        echo -n "...writeable"
    else
        echo "...not writeable"
fi
exit 0

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Первое, что вы должны сделать - это рефакторинг вашего кода с учетом простоты, тогда ошибка цитирования также исчезнет. Попробуйте:

if ssh [flags] test -w "'$file'"; then

Инкапсулируйте ваши SSH-флаги в конфигурацию ssh, чтобы облегчить их повторное использование, и ваш скрипт значительно сократится.

1 голос
/ 05 октября 2011

В этом контексте у вас все нормально с одинарными кавычками; к тому моменту, когда скрипт увидит удаленный bash, ваш локальный bash уже подставил переменные, которые вы хотите заменить.

Однако ваш сценарий - полный беспорядок. Вы должны поместить повторяющийся код в функции, если вы не можете существенно упростить его.

#!/bin/bash

remote () {
    # most of the parameters here are at their default values;
    # why do you feel you need to specify them?
    #ssh -l "user" -i ~/.ssh/id_rsa -p 22 hostname "$@"
    ssh hostname "$@"
    # —---------^
    # if you really actually need to wrap the remote
    # commands in bash -c "..." then add that here
}

exists_and_writable () {
    echo -n "$1"

    if remote test -d "$1"; then
        echo -n "...OK..."
    else
        echo "...FAIL"
        exit 1
    fi

    if remote test -w "$1"; then
        echo "...writeable"
    else
        echo "...not writeable"
    fi
}

Base="/tmp"
# Note the need for additional quoting here
Sub="one\\ space/another\\ space"

exists_and_writable "$Base"

BaseAndSub="$Base/$Sub"

exist_and_writable "$BaseAndSub"

exit 0
0 голосов
/ 20 апреля 2018
ssh -qnx "useraccount@hostname" 
     "test -f ${file absolute path} ||
      echo ${file absolute path} no such file or directory"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...