ไม่สามารถ ssh ในเครื่องระยะไกลโดยใช้เชลล์สคริปต์ใน Crontab


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, รหัสผ่าน) ปฏิเสธการอนุญาต (publickey, gssapi-keyex, gssapi-with-mic, รหัสผ่าน) ปฏิเสธการอนุญาต (publickey, gssapi-keyex, gssapi-with-mic, รหัสผ่าน)

คุณมีความตั้งใจในเรื่องนี้อย่างไร? คุณกำลังพยายามทำอะไรอยู่ เพียงเพื่อให้คุณรู้ว่าเราไม่สามารถช่วยเหลือกิจกรรมที่เป็นอันตรายใด ๆ ถ้านั่นเป็นความตั้งใจของคุณ
ทิโมธี Frew

คำตอบ:


14

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

ปัญหาเดียวของการใช้ข้อความรหัสผ่านคือคุณต้องป้อนด้วยตนเองอย่างน้อยหนึ่งครั้ง ดังนั้นข้างต้นจะไม่ทำงานโดยอัตโนมัติหลังจากรีบูต


ยอดเยี่ยม - ขอบคุณ ฉันสามารถอยู่ได้โดยไม่ต้องรีสตาร์ทอัตโนมัติหลังจากรีบูตตอนนี้อย่างน้อย
Peter Mounce

ใช้ ssh-cron เพื่อตั้งค่าการเชื่อมต่อ SSH ตามกำหนดเวลาเพื่อรักษาความปลอดภัยเซิร์ฟเวอร์โดยไม่ต้องเปิดเผยคีย์ SSH ของคุณ แต่ใช้ตัวแทน SSH unix.stackexchange.com/questions/8903/…
Luchostein

4

ใครพิมพ์รหัสผ่าน งาน cron ไม่สามารถรับที่ ssh-agent ของคุณได้ดังนั้นรหัสสาธารณะจะไม่ทำงาน

คุณต้องsshระบุไฟล์คีย์อย่างชัดเจน (ดู-iตัวเลือก) เนื่องจากไม่สามารถสอบถามตัวแทนได้ และกุญแจนั้นจะต้องมีวลีรหัสผ่านที่ว่างเปล่า


พยายามโดยส่งชื่อผู้ใช้และรหัสผ่านด้วย - ssh -t -t -o ConnectTimeout = ผู้ใช้ 60 คน @ machine $ 1 finger | หาง -1 | awk '{พิมพ์ $ 1}' </ home / user / passwd ---- ฉันหมายถึงโฮมไดเร็กทอรีอยู่บน NFS ดังนั้นจึงติดตั้งกับ everymachine

หาก SSH มีความรู้สึกใด ๆ ก็ใช้/dev/ttyในการอ่านรหัสผ่านแทนstdin; ที่จะไม่ทำงานจาก cron
geekosaur

พยายามให้ตัวเลือก -i แต่ไม่มีโชค! ---- ssh -o ConnectTimeout = 60 -i /home/subrahmanyam/.ssh/known_hosts เครื่องนิ้ว $ 1 | หาง -1 | awk '{พิมพ์ $ 1}' ------ คำเตือน: ไฟล์ลับส่วนตัวที่ไม่มีการป้องกัน! สิทธิ์ 0640 สำหรับ '/home/user/.ssh/known_hosts' นั้นเปิดเกินไป ขอแนะนำให้ผู้อื่นไม่สามารถเข้าถึงไฟล์กุญแจส่วนตัวของคุณได้ คีย์ส่วนตัวนี้จะถูกละเว้น สิทธิ์ที่ไม่ดี: เพิกเฉยคีย์:

ทำไมถึงบ่นknown_hosts? แต่ใช่คุณต้องระวังการอนุญาต - ไฟล์กุญแจส่วนตัวควรเป็นโหมด 0600 หรือแม้แต่ 0400 ซึ่งคุณเป็นเจ้าของ หากคุณต้องการให้ผู้ใช้รายอื่นสามารถใช้งานได้เช่นกันคุณจะเห็น POSIX ACLs หรือคล้ายกัน
geekosaur

ลองคิดดูสิฉันเห็น GSSAPI กำลังได้รับการเสนอให้อยู่ในนั้นดังนั้นความเป็นไปได้อีกอย่างก็คือการได้รับแท็บคีย์และใช้มันเพื่อkinitงาน cron ที่กล่าวถึงคีย์แท็บยังต้องการความระมัดระวังเหมือนกันในการอนุญาต แต่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นอกจากนี้คุณยังจะต้องแล้วถูกบันทึกไว้ในที่มีการใช้งาน (Ubuntu เริ่มตัวแทนเมื่อ GUI เริ่มทำงาน)

หากคุณใส่ไว้ในสคริปต์อื่นคุณจะต้องเรียกมันด้วยsourceหรือ.เพราะจะต้องตั้งค่าSSH_AUTH_SOCKตัวแปร


0

ใช้ssh-cronเพื่อตั้งค่าการเชื่อมต่อ SSH ตามกำหนดเวลาเพื่อรักษาความปลอดภัยเซิร์ฟเวอร์โดยไม่ต้องเปิดเผยคีย์ SSH ของคุณ แต่ใช้ตัวแทน SSH


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.