คุณสามารถทำการเชื่อมต่อ ssh ภายในเซสชัน cron สิ่งที่คุณต้องการคือการตั้งค่าการตรวจสอบกุญแจสาธารณะให้มีการเข้าถึงแบบไม่ใช้รหัสผ่าน สำหรับการทำงาน, คุณจำเป็นต้องมีในแต่ละเซิร์ฟเวอร์ระยะไกลของPubkeyAuthentication yes
sshd_config
คุณสามารถสร้างคู่คีย์ส่วนตัว / สาธารณะโดยมีหรือไม่มีข้อความรหัสผ่าน หากคุณใช้ข้อความรหัสผ่าน (แนะนำใหม่) คุณจะต้องเริ่มต้น ssh-agent ด้วย หากไม่มีข้อความรหัสผ่านคุณจะต้องเพิ่มพารามิเตอร์-i your_identity_file
ลงในssh
บรรทัดคำสั่งเท่านั้น 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 -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
ปัญหาเดียวของการใช้ข้อความรหัสผ่านคือคุณต้องป้อนด้วยตนเองอย่างน้อยหนึ่งครั้ง ดังนั้นข้างต้นจะไม่ทำงานโดยอัตโนมัติหลังจากรีบูต