iptables --flush
100개가 넘는 서버에서 명령을 실행 해야 합니다 . 루트 자격 증명은 없지만 내 계정에 대한 sudo 액세스 권한이 있습니다. 그래서 모든 서버에서 이 명령을 실행하기 위해 아래 스크립트를 생각해 냈습니다.
flashhosts 파일에 서버 이름을 추가했습니다.
[root@~]# cat testscript.sh
> for i in `cat /flushhosts`
>
> do
>
> sshpass -p 'Mypwd' ssh -t username@$i sudo /sbin/iptables --flush
>
> cat << EOF || "Mypwd"
>
> done
[root@~]# ./testscript.sh
./testscript.sh: line 6: syntax error: unexpected end of file
스크립트에서 누락된 내용을 찾을 수 없습니다.
답변1
다른 접근 방식을 사용하고 싶다면 다음과 같이 Expect를 사용하는 것이 좋습니다.
작은 기대 스크립트 만들기ex1.sh
#!/usr/bin/expect -f
set arg1 [lindex $argv 0]
spawn ssh username@$arg1
expect "password: "
send "Mypwd\r"
expect "$ "
send "sudo /sbin/iptables --flush\r"
expect "password "
send "Mypwd\r"
expect "$ "
send "exit\r"
그런 다음 다음과 같은 루프에서 사용할 수 있습니다.
for i in $(</flushhosts); do ./ex1 $i; done
이 경우에는 Expect를 좀 더 유연하게 사용할 수 있습니다.
답변2
노력하다
for i in $(</flushhosts)
do
echo "Mypwd" | sshpass -p 'Mypwd' ssh -t username@$i sudo /sbin/iptables --flush
done
- 이것이 작동할 수도 있지만 sudo에 들어갈지는
Mypwd
확실 하지 않습니다.echo Mypwd
$(</flushhosts)
$(cat /flushhosts)
나중에 참조되는 "cat /flushhosts"와 동일합니다 .
~에 대한cat<<"EOF"||내 비밀번호
1) 고양이<<"EOF"
그러면 EOF라는 단어가 나타날 때까지 줄을 읽고 전체 텍스트를 cat에 공급합니다. 여기에는 done
단어가 포함됩니다.
2) ||내 비밀번호
cat이 0이 아닌 값을 반환하면 Mypwd가 명령으로 실행됩니다.
EOF 단어가 발견되지 않았기 때문에 bash가 문서 끝에 도달하면 for ... do
그것으로 끝나지 않으므로 done
구문 오류가 발생합니다.
나는 이것이 당신이 원하는 것이 아니기를 바랍니다.
문법
cat <<EOF
hello world
EOF
여기서 문서라고 하는 것은 쉘 스크립트에서 데이터를 제공하는 방법입니다.