
서버에 로그인하고, 서버에서 디스크 사용량을 가져오고, 나에게 이메일을 보내고, 서버를 종료하는 쉘 스크립트를 만들고 싶습니다. 또한 가능하다면 매일 하도록 한다. 이것이 내가 가진 것입니다:
#!/usr/bin/bash
ssh -p 1111 [email protected]
CURRENT=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
mail -s 'Disk Space Alert' [email protected] << EOF
Disk usage is at: $CURRENT%
EOF
fi
쉘 스크립트의 이름은 example.sh입니다. 실행하면 계속해서 비밀번호를 묻고 로그인하면 아무 일도 일어나지 않습니다.
답변1
먼저, 비밀번호 없이 원격 시스템에 로그인하는 데 사용할 공개 키를 생성합니다.
ssh-keygen -t rsa -b 4096 -C "your_username"
~/.ssh/
그러면 사용자 이름을 레이블로 사용하여 디렉터리 에 4096비트 RSA 키가 생성됩니다 . 그런 다음 SSH를 통해 연결할 때 사용되도록 이 새 키를 ssh-agent에 추가하세요.
ssh-agent -s
ssh-add ~/.ssh/id_rsa
키 생성 중에 사용자 지정 이름을 설정한 경우 id_rsa
해당 이름으로 바꿉니다.
이제 공개 키 내용을 클립보드에 복사하세요.
clip < ~/.ssh/id_rsa.pub
그런 다음 원격 서버에 로그인하여 원격 사용자의 파일을 편집합니다.ssh -p YOURPORT [email protected]
authorized_keys
vim .ssh/autorized_keys
방금 클립보드에 복사한 내용을 붙여넣습니다. 이를 통해 인증서를 사용하는 대신 암호 없이 컴퓨터에서 원격 호스트로 연결할 수 있습니다(보통 훨씬 더 안전합니다).
example-script.sh
이제 원격 호스트의 홈 디렉터리에 스크립트를 만들어야 합니다 ( chmod a+x example-script.sh
나중에 실행 파일로 설정해야 합니다).
#!/usr/bin/env bash
CURRENT=$(df / | awk '/\// { print $5}' | sed 's/%//g')
mail -s 'Disk Space Alert' [email protected] << EOF
Disk usage is at: $CURRENT%
EOF
이제 local-script.sh
나중에 명령을 쉽게 실행할 수 있도록 로컬 홈 디렉토리에 스크립트를 작성하십시오(다시 한번 말하지만 나중에 실행 가능하도록 만드십시오).
#!/usr/bin/env bash
ssh -P YOURPORT [email protected] ./example-script.sh
이 스크립트를 사용하면 ./local-script.sh
홈 디렉터리에서 단 한 줄로 원격 스크립트를 실행할 수 있습니다. 그런 다음 이를 파일에 별칭으로 추가하여 원하는 다른 별칭을 .bashrc
실행할 수 있습니다 . local-script
의 절대 경로( /home/your_username/local-script.sh
) 를 사용하여 crontab
매일 특정 시간에 실행되도록 할 수도 있습니다.
답변2
먼저 구문 때문에 아무 일도 일어나지 않는 이유를 설명합니다. ssh 명령의 형식은 다음과 같습니다. ssh server
이는 로그인만 하고 대화형으로 일부 명령을 수동으로 입력하려는 경우입니다. 그러나 로그인 후 일부 명령이 자동으로 실행되도록 하려면 : 을 수행해야 하므로 다음 줄에만 ssh server somecommand
입력하면 작동하지 않습니다.somecommand
음, 원할 때마다 디스크 공간 정보를 이메일로 보내는 동시에 예약된 이메일을 지원하는 시스템을 원한다면 다음 세 부분으로 구성된 시스템을 권장합니다.
- 디스크 정보와 이메일 로직을 얻는 서버의 스크립트 하나(예:
/home/yourusername/script.sh
- script.sh를 실행하는 crontab
- 임의적이고 변덕스러운 요청에 대해 ssh를 통해 스크립트를 실행할 수 있습니다.
script.sh
이는 서버에 배치한 스크립트입니다(예: /home/yourusername/script.sh).
#!/bin/bash
s="Disk Space Alert: $(df / | grep / | awk '{ print $5}')"
mail -s $s [email protected]
# Feedback
echo $s
sed
단순히 기호를 제거했기 때문에 제거했지만 %
나중에 다시 추가하는 경우 sed를 중복하여 사용하는 것 같아서 제거했습니다.
둘째, 제목 줄에 딱 맞도록 디스크 사용량 정보를 압축했습니다. 이것이 작동하지 않으면 물론 원래 형식으로 수정할 수 있지만 오류가 있는지 알아볼 수 있도록 어느 쪽이든 모두에게 알려주세요. 등
크론탭
서버에서 crontab을 편집합니다(예: 서버에 ssh 접속). 그런 다음 다음 명령을 진행합니다.
$ crontab -e
형식은 아시죠?
# m h dom mon dow command
그래서 매일 오전 8시에
0 8 * * * /home/yourusername/script.sh
따라서 스크립트를 이미 테스트하고 이메일 전송이 작동한다는 것을 알고 있는 한 crontab은 스크립트를 실행하고 이메일이 매일 오전 8시에 전송되도록 합니다.
디스크 정보를 이메일로 받기 위한 임의 요청
ssh만 하고 스크립트 명령을 맨 끝에 넣으세요
ssh -p 1111 [email protected] /home/yourusername/script.sh
이는 ssh 구문을 사용 ssh server somecommand
하므로 로그인하여 모든 명령을 실행하고 결과를 로컬 표준 출력으로 반환합니다.
피드백 라인이 있기 때문에 이메일을 보내야 할 뿐만 아니라 Disk Space Alert: ...
스크립트가 실행되었는지 여부에 대한 즉각적인 피드백을 받을 수 있도록 메시지도 볼 수 있습니다.