Crontab에서 쉘 스크립트를 사용하여 원격 시스템에 ssh를 로그인 할 수 없음


11

아래는 내가 실행하려고하는 스크립트이며 문제없이 실행됩니다.

for i in `seq 200 2100`
do
  usr=(`ssh -t -t -o ConnectTimeout=60 machine$1 finger | tail -1 | awk '{print$1}'`) 
  echo $usr
done

그러나 일단 crontab에 추가하면 사용자에게 제공하지 않습니다.

22  12  *  *  *  sh /home/subrahmanyam/Scripts/who.sh

당신의 생각을 해주세요 .....

cron 악마가 실행 중일 수 있으므로 바이너리를 포함해야합니다 ...?


1
권한이 거부되었습니다 (publickey, gssapi-keyex, gssapi-with-mic, password). 권한이 거부되었습니다 (publickey, gssapi-keyex, gssapi-with-mic, password). 권한이 거부되었습니다 (publickey, gssapi-keyex, gssapi-with-mic, password).

이것에 대한 당신의 강점은 무엇입니까? 당신은 무엇을 달성하려고합니다. 악의적 인 활동이 귀하의 의도라면 도움을 줄 수 없음을 알았습니다
Timothy Frew

답변:


14

cron 세션 내에서 ssh 연결을 작성할 수 있습니다. 비밀번호없이 액세스 할 수 있도록 공개 키 인증을 설정해야합니다. 이것이 작동하려면 PubkeyAuthentication yes각 원격 서버 에 있어야 합니다 sshd_config.

암호를 사용하거나 사용하지 않고 개인 / 공개 키 쌍을 만들 수 있습니다. 암호 구 (권장)를 사용하는 경우 ssh-agent도 시작해야합니다. 암호없이, 당신은 단지 매개 변수를 추가 할 필요 -i your_identity_filessh명령 줄. 기본값으로 ssh사용 $HOME/.ssh/id_rsa합니다.

암호 문구와 함께 키 페어를 사용하여 예제를 복제했습니다. 내가 한 방법은 다음과 같습니다.

1) 암호로 키 페어를 생성했습니다. 개인 키를로 저장했습니다 ~/.ssh/id_rsa_test. 기본적으로 올바른 권한이 있어야합니다. 빈 암호를 사용하지 않으면 빈 암호를 입력 할 수 있습니다.

john@coffee:~$ ssh-keygen -N "somephrase" -f .ssh/id_rsa_test
Generating public/private rsa key pair.
Your identification has been saved in .ssh/id_rsa_test.
Your public key has been saved in .ssh/id_rsa_test.pub.
[snip]

2) 공개 키를 서버에 보냈으며 모든 서버에 대해 동일한 작업을 수행했습니다. PubkeyAuthentication활성화 해야합니다 .

john@coffee:~$ ssh-copy-id -i .ssh/id_rsa_test server1
The authenticity of host 'server1 (11.22.33.1)' can't be established.
RSA key fingerprint is 79:e8:0d:f5:a3:33:1c:ae:f5:24:55:86:82:31:b2:76.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server1,11.22.33.1' (RSA) to the list of known hosts.
john@server1's password: 
Now try logging into the machine, with "ssh 'server1'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

3)로 ssh-agent를 서비스로 실행하십시오 -s. 로그 아웃해도 종료되지 않습니다. 출력은 유효한 쉘 스크립트이며, ssh 클라이언트가 연결 방법을 알 수 있도록 환경을 설정합니다. 파일에 파일을 저장합니다 (첫 번째 줄만 필요합니다).

john@coffee:~$ ssh-agent -s | head -n 1 > ssh-agent.cf 
john@coffee:~$ cat ssh-agent.cf 
SSH_AUTH_SOCK=/tmp/ssh-VhyKL22691/agent.22691; export SSH_AUTH_SOCK;

4) 위의 내용을 현재 환경에로드하여 ssh-add개인 키를 추가 하는 데 사용할 수 있습니다 ssh-agent. 위의 암호.

john@coffee:~$ source ssh-agent.cf 
john@coffee:~$ ssh-add  .ssh/id_rsa_test
Enter passphrase for .ssh/id_rsa_test: 
Identity added: .ssh/id_rsa_test (.ssh/id_rsa_test)

5) 확인되었습니다.

john@coffee:~$ ssh-add -l
2048 96:58:94:67:da:67:c0:5f:b9:0c:40:9b:52:62:55:6a .ssh/id_rsa_test (RSA)

6) 내가 사용한 스크립트는 당신보다 약간 수정되었습니다. ssh 명령을 괄호로 묶지 않고 backticks를 사용하지 않고 $()명령 대체를위한 더 나은 대안입니다 (이는 bash호환 가능하며 사용중인 쉘은 언급하지 않았습니다). 나는 당신과 똑같은 ssh 명령을 사용했습니다.

john@coffee:~$ cat foo.sh 
#!/bin/bash

source /home/john/ssh-agent.cf
for server in server1 server2; do
    usr=$(ssh -t -t -o ConnectTimeout=60 $server finger | tail -1 | awk '{print $1}')
    date=$(ssh -o ConnectTimeout=60 $server date)
    echo "$server - $date - $usr" >> /home/john/foo.log
done

7) 내 crontab (내는 sh실제로 bash)

john@coffee:~$ crontab -l
# m h  dom mon dow   command
*/1  *  *  *  *  sh /home/john/foo.sh

8) 출력

john@coffee:~$ tail -n 4 foo.log
server1 - Wed Mar 23 14:12:03 EET 2011 - john
server2 - Wed Mar 23 14:12:04 EET 2011 - john
server1 - Wed Mar 23 14:13:03 EET 2011 - john
server2 - Wed Mar 23 14:13:04 EET 2011 - john

암호를 사용할 때의 유일한 문제는 암호를 한 번 이상 수동으로 입력해야한다는 것입니다. 따라서 재부팅 후 위의 내용은 자동으로 작동하지 않습니다.


훌륭합니다-감사합니다. 적어도 지금은 재부팅 후 자동 재시작없이 살 수 있습니다.
피터 Mounce

SSH 키를 노출시키지 않고 SSH 에이전트를 사용하여 보안 서버에 스케줄 된 SSH 연결을 설정하려면 ssh-cron을 사용하십시오. unix.stackexchange.com/questions/8903/…
Luchostein

4

누가 암호를 입력합니까? 크론 작업은 ssh-agent에서 얻을 수 없으므로 공개 키가 작동하지 않습니다.

에이전트를 쿼리 할 수 ​​없으므로 ssh키 파일을 명시 적으로 제공해야합니다 ( -i옵션 참조 ). 이 키 에는 빈 암호 문구가 있어야합니다 .


ssh -t -t -o ConnectTimeout = 60 user @ machine $ 1 finger | 사용자 이름과 비밀번호도 전달하여 시도했습니다. 꼬리 -1 | awk '{print $ 1}'</ home / user / passwd ---- 홈 디렉토리가 NFS에 있으므로 모든

ssh가 의미가 있다면, /dev/tty대신 암호를 읽는 데 사용 합니다 stdin. 그것은 cron에서 작동하지 않습니다.
geekosaur

-i 옵션을 주려고했지만 운이 없다! ---- ssh -o ConnectTimeout = 60 -i /home/subrahmanyam/.ssh/known_hosts machine $ 1 손가락 | 꼬리 -1 | awk '{print $ 1}'------ 경고 : 보호되지 않은 개인 키 파일! '/home/user/.ssh/known_hosts'에 대한 권한 0640이 너무 열려 있습니다. 개인 키 파일은 다른 사람이 액세스 할 수없는 것이 좋습니다. 이 개인 키는 무시됩니다. 나쁜 권한 : 키 무시 :

왜 불평하고 known_hosts있습니까? 그러나 그렇습니다. 개인 키 파일은 사용자가 소유 한 모드 0600 또는 0400이어야합니다. 다른 사용자도 사용할 수 있으려면 POSIX ACL 또는 이와 유사한 것을 살펴보십시오.
geekosaur

그것을 생각해 보니, GSSAPI가 제공되는 것을 보았으므로 다른 가능성은 키 탭을 가져 와서 kinitcron 작업 내부에서 사용할 수 있습니다. 즉, 키탭도 권한에 대해 동일한주의가 필요합니다. 그러나 ssh적어도 그들에 대해 불평하지 않을 것입니다.
geekosaur

1

forcefsck와 같은 임시 파일을 저장하는 대신 find활성 에이전트를 검색 하는 데 사용하는 것을 선호합니다 .

을 필요로하는 스크립트의 주제 ssh-agent에서 나는 다음을 사용합니다.

export SSH_AUTH_SOCK=$(find /run/user/$(id -u)/ -mindepth 2 -maxdepth 2 -path '*keyring-*' -name 'ssh' -print -quit 2>/dev/null)

ssh-agent소켓을 검색 하고 첫 번째 소켓을 반환합니다. 현재 사용자로만 제한되므로 실수로 다른 사용자를 사용하려고 시도하지 않고 권한 거부 오류가 발생하지 않습니다. 또한 이미 활성화 된 상태로 로그인해야합니다 ssh-agent. (GUI 시작시 우분투는 에이전트를 시작합니다).

다른 스크립트에 넣고 경우에, 당신은 그것을 호출 할 필요가 있습니다 source또는 .그것이 설정해야하기 때문에 SSH_AUTH_SOCK변수를.


0

SSH 키를 노출시키지 않고 SSH 에이전트를 사용하여 보안 서버에 스케줄 된 SSH 연결을 설정 하려면 ssh-cron 을 사용하십시오 .


0

crontab에서 다음과 같이 스크립트 또는 명령을 실행할 수 있습니다.

0 * * * * bash -c -l "/home/user/sshscript.sh"

또는

0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.