我编写了一个 bash 脚本来检查挂载 cifs 共享时是否输入了正确的密码并将其报告给用户。
它根本不起作用。我的意思是,现在我看它的整个部分grep
甚至没有意义。它对原始命令执行 grep,而不是输入密码后的输出。
#!/bin/bash
share=sudo mount.cifs //192.168.0.10/windows-share Shared/ -o user=me
$share
if [[ ($share | $(grep) "mount error (13): Permission denied") ]]; then
echo "Wrong password"
else
echo "Successful mount"
fi
这是密码错误时输出的样子
Password for [email protected]/windows-share:
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)
我正在尝试 grep 第二行作为我的条件语句。如果这可能的话...
答案1
您的脚本存在几个问题:
如果您希望变量包含空格(或对 shell 有特殊含义的其他字符,例如
;
或&
),那么您需要引用整个字符串。例如share='sudo mount.cifs //192.168.0.10/windows-share Shared/ -o user=me'
您编写的方式,不带引号,您正在设置
share=sudo
然后运行mount.cifs ...
,这根本不是您想要的。更重要的是,你的脚本的整个设计都是错误的。不需要定义 $share 变量然后执行它,即使你这样做,你也不会通过 grep 该变量获得挂载的结果(并且忽略了你的
($share | $(grep) ...)
行甚至不是有效的 shell的事实)句法)。
您的脚本应该更像这样,它sudo mount
直接测试命令的退出代码:
if sudo mount.cifs //192.168.0.10/windows-share Shared/ -o user=me ; then
echo Successful mount
else
echo Mount failed
fi
顺便说一句,请参阅man mount
并搜索EXIT STATUS
以查看可返回的退出状态代码的完整列表mount
。但大多数时候,您只需要关心成功(0)或失败(其他任何事情)。
如果您确实需要处理部分或全部非零退出代码,您应该这样做:
sudo mount.cifs //192.168.0.10/windows-share Shared/ -o user=me
result=$?
case "$result" in
0) echo Successful mount ;;
1) echo incorrect invocation or permissions ;;
2) echo 'system error (out of memory, cannot fork, no more loop devices)' ;;
4) echo internal mount bug ;;
8) echo user interrupt ;;
16) echo problems writing or locking /etc/mtab ;;
32) echo mount failure ;;
64) echo some mount succeeded ;;
esac