使用文件系统函数进行Bash编程

时间:2011-09-30 09:59:02

标签: bash ssh directory

本周我一直忙着试图围绕一个小Bash程序来将CMS从一台服务器迁移到另一台服务器。对此的重新考虑是因为我有更多的这些要做,并且需要及时完成,因此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 个答案:

答案 0 :(得分:1)

将shebang更改为#!/bin/bash -x并查看输出...

  1. 您使用单引号将字符串存储在变量SSHRoot中,这意味着不会展开任何变量,即$仍然是$。请改用双引号,即"

  2. 将命令的输出存储在bash中,使用

    VAR = $(CMD)

  3. 命令的存在状态存储在变量$?中。在ssh-command

  4. 之后检查一下
  5. 您永远不会在代码中执行ssh-command

  6. bash-programming的好链接here

答案 1 :(得分:1)

尝试以下方法:

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

答案 2 :(得分:1)

将字符串作为参数传递给远程主机并非易事;你需要use arrays。一个测试例子:

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

这是一种罕见的情况,使用unquoted variable expansion完全没问题。

答案 3 :(得分:0)

#!/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

相关问题