![원격 서버를 sshpassing하고 grep 결과를 얻기 위한 쉘 스크립트](https://linux55.com/image/184328/%EC%9B%90%EA%B2%A9%20%EC%84%9C%EB%B2%84%EB%A5%BC%20sshpassing%ED%95%98%EA%B3%A0%20grep%20%EA%B2%B0%EA%B3%BC%EB%A5%BC%20%EC%96%BB%EA%B8%B0%20%EC%9C%84%ED%95%9C%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8.png)
sshpass를 사용하여 원격 서버 명령의 결과를 얻기 위해 몇 가지 스크립트를 작성 중입니다.
여러 원격 호스트를 시도하기 전에 명령 결과를 얻기 위해 하나의 테스트 서버로만 테스트를 시도했습니다.
이 명령은 호스트에 사용자가 존재하는지 확인하는 데 사용됩니다. 사용자가 존재하면 결과를 인쇄하고 싶습니다. 그래서 아래와 같이 코딩했습니다.
#!/bin/bash
exec sshpass -pMY_PASSWORD ssh -o StrictHostKeyChecking=no root@IP_ADDRESS grep USER /etc/passwd | cut -f1 -d:
if [ $? -ne 0 ]
then
echo "command failed..."
exit 1
fi
하지만 위 스크립트를 시도하면 일부 서버 로그인 메시지와 아래 오류가 인쇄됩니다.
basename: extra operand `tty'
Try `basename --help' for more information.
basename: extra operand `tty'
Try `basename --help' for more information.
사용자가 존재하고 이러한 오류가 없는 경우에만 결과를 얻고 싶습니다.
누구든지 도와줄 수 있나요?
답변1
원격 서버의 로그인 셸 구성 파일에 있는 코드는 이러한 비대화형 로그인을 처리하기에는 제대로 작성되지 않았습니다. 이 문제를 해결하면 basename
문제가 tty
해결됩니다. (원격 시스템에서 일시적으로 루트의 이름을 바꾸고 .profile
자신 .bash_profile
의 것을 사용해 보십시오 . 여전히 오류가 발생하면 시스템 로그인 스크립트에 있는 것입니다. 그렇지 않은 경우 루트의 로그인 스크립트에 있는 것입니다. with 의 사용을 ssh -o StrictHostKeyChecking=no root@IP_ADDRESS id
보호하지 못할 수도 있습니다 .)tty
[ -t 1 ] && ...
exec
그러나 이를 사용하여 프로그램 을 실행 하므로 sshpass
우리에게 보여준 나머지 스크립트는 실행되지 않습니다. 제거하다 exec
. (실제로 사용해야 하는 이유를 알기 전까지는 절대 사용하지 마십시오.) 그러나 그렇게 하더라도 성공을 테스트하는 다음 코드는 파이프라인의 마지막 명령 결과만 확인합니다. cut
, 실패할 확률이 매우 낮습니다.
인증서 기반 인증 sshpass
대신 내장된 일반 텍스트 비밀번호를 사용하는 특별한 이유가 있나요?ssh
권한이 없는 계정이 아닌 루트로 원격 시스템에 로그인한 특별한 이유가 있나요?