bash shell - ssh สคริปต์ระยะไกลจับเอาท์พุทและรหัสออก?


23

ฉันต้องการใช้เชลล์เพื่อเรียกใช้สคริปต์บนเซิร์ฟเวอร์ระยะไกล ฉันต้องการจับเอาท์พุทของสคริปต์นั้น (ข้อความบันทึกของมัน) และรหัสทางออกที่ส่งคืน

ถ้าฉันทำสิ่งนี้:

ssh user@server /usr/local/scripts/test_ping.sh
echo "$?"

ฉันได้รับรหัสทางออก แต่ไม่สามารถจับข้อความบันทึกระยะไกลได้

ถ้าฉันทำสิ่งนี้:

local RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo "$?" 
LOG "${RESULTS}";

ฉันได้รับการบันทึกผลลัพธ์ของฉันโดยใช้ฟังก์ชั่น LOG แต่ไม่สามารถรับรหัสทางออกที่ถูกต้องได้ฉันถือว่ารหัสที่ฉันได้รับคือรหัสจากการมอบหมาย varianble

ฉันต้องการใช้ฟังก์ชั่น LOG ของฉันต่อไปเพื่อเก็บเอาท์พุททั้งหมดในขณะที่ฟอร์แมตและส่งสิ่งต่าง ๆ ไปยังไฟล์ syslog และหน้าจอสำหรับฉัน

ฉันจะจับผลลัพธ์ใน var AND เพื่อรับรหัสทางออกที่ถูกต้องจากสคริปต์ระยะไกลได้อย่างไร


คำตอบ:


37

เหตุผลที่คุณไม่ได้รับรหัสข้อผิดพลาดที่ถูกต้องเพราะlocalจริงๆแล้วเป็นสิ่งสุดท้ายที่ถูกเรียกใช้งาน คุณจำเป็นต้องประกาศตัวแปรเป็นท้องถิ่นก่อนที่จะเรียกใช้คำสั่ง

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

คุณสามารถดูปัญหาได้ที่นี่:

$ bar() { foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2
$ bar() { local foo=$(ls asdkjasd 2>&1); echo $?; }; bar
0
$ bar() { local foo; foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2

8

ดูเหมือนว่า "ท้องถิ่น" จะเป็นปัญหา สิ่งนี้ใช้ได้กับฉัน:

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

คุณพูดถูกเกินไป แต่ jodanm ก็เร็วขึ้น!
mconlin

ใช่ 26 วินาที
Hauke ​​Laging

5
ไม่ใช่ชั้นเรียนภาษาอังกฤษ แต่ไม่ถูกต้องที่จะพูดว่า 'เร็วกว่า'
mtahmed

5
ฉันรู้ว่ามันเป็นเรื่องตลก ฉันคิดว่าไม่ดี บนอินเทอร์เน็ตไม่มีใครรู้ว่าคุณเป็นสุนัข
mconlin

นอกจากนี้ยังมีคำตอบ jordanm อธิบายว่าทำไมนี้เป็นปัญหาที่เกิดขึ้น :)
Doktor J

2

ที่จริงแล้วทั้งคำตอบข้างต้นไม่ได้ดักจับรหัสข้อผิดพลาดและข้อความ ssh ซึ่งสามารถทำได้ดังนี้ (ละเว้นฟังก์ชั่นที่กำหนดเองของฉัน):

# move the deployment package from the tmp dir
msg=$(ssh -i "$(eval echo $identity_file)" -o ConnectTimeout=5 "$ssh_user"'@'"$ssh_server" \
sudo -iu "$etl_user" bash "$tgt_deployment_dir"'/src/bash/'"$run_unit/$run_unit"'.sh' \
    -a create-relative-package 2>&1)

# fail on any non-success
export exit_code=$?
export err_msg="network error: ""$msg"
test $exit_code -ne 0 && doExit $exit_code $err_msg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.