cifs 공유를 마운트할 때 올바른 비밀번호가 입력되었는지 확인하고 이를 사용자에게 보고하기 위해 bash 스크립트를 작성했습니다.
전혀 작동하지 않습니다. 내 말은, 그 모든 부분이 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
스크립트에 몇 가지 문제가 있습니다.
;
변수에 공백(또는 또는 와 같이 셸에 특별한 의미가 있는 기타 문자)을 포함하려면&
전체 문자열을 인용해야 합니다. 예를 들어share='sudo mount.cifs //192.168.0.10/windows-share Shared/ -o user=me'
따옴표 없이 작성하는 방식은 을 설정
share=sudo
하고 실행하는 것인데mount.cifs ...
, 이는 전혀 원하는 것이 아닙니다.더 중요한 것은 스크립트의 전체 디자인이 잘못되었다는 것입니다. $share 변수를 정의한 다음 실행할 필요가 없으며 그렇게 했더라도 해당 변수를 검색하여 마운트 결과를 얻지 못할 것입니다(그리고 라인이
($share | $(grep) ...)
유효한 쉘 구문이 아니라는 사실도 무시합니다) ).
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
하고 검색하세요 . 하지만 대부분의 경우 성공(0) 또는 실패(다른 모든 것)에만 관심이 필요합니다.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