本周我一直忙着试图围绕一个小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是数字的。 ?
答案 0 :(得分:1)
将shebang更改为#!/bin/bash -x
并查看输出...
您使用单引号将字符串存储在变量SSHRoot
中,这意味着不会展开任何变量,即$
仍然是$
。请改用双引号,即"
将命令的输出存储在bash中,使用
VAR = $(CMD)
命令的存在状态存储在变量$?
中。在ssh-command
您永远不会在代码中执行ssh-command
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