วิธีรันคำสั่งในโหมดแบตช์เหนือ ssh?


9

ฉันจะรันคำสั่งในโหมดแบตช์ผ่าน ssh ได้อย่างไร นั่นคือสิ่งที่sshเทียบเท่าคำสั่งคือsftp -b <filename> <hostname>อะไร?

ฉันมีชุดคำสั่งที่ฉันต้องการเรียกใช้ข้ามชุดโฮสต์ที่เชื่อมต่อsshกัน กว่าsftpฉันเก็บคำสั่งในไฟล์filenameและเชื่อมต่อกับโฮสต์และเรียกใช้คำสั่งโดยใช้คำสั่งดังกล่าวก่อนหน้า

เป็นไปได้sshไหม?


ฉันได้ผ่านนี้คำถาม แต่ฉันยังไม่สามารถหาวิธีเรียกใช้คำสั่งในโหมดแบทช์
Srikanth

และบางคนสามารถสร้างแท็ก #batchmode และติดแท็กคำถามนี้ได้ไหม?
Srikanth

คำตอบ:


9

แก้ไขให้ฉันถ้าฉันผิด แต่ดูเหมือนว่าคุณต้องการที่จะเรียกใช้คำสั่งเชลล์ปกติบนเซิร์ฟเวอร์ระยะไกลที่สคริปต์อยู่ภายในเครื่อง

#!/bin/sh
trap "rm -f /tmp/sendonssh.$$.*" 0 1 2 3 15
# commands to run on the remote server
cat <<'EOF' >> /tmp/sendonssh.$$.sh
mkdir -p /tmp/foobar.$$
mv $HOME/xyzzy /tmp/foobar.$$
chmod 640 $HOME/xyzzy
EOF
# call for each argument
for userhost in "$@"; do
    errorout=`ssh -aTxo BatchMode=yes $userhost /bin/sh -s < /tmp/sendonssh.$$.sh 2>&1`
    rc=$?
    if [ $rc -ne 0 ]; then
        echo "Error: $userhost: $errorout"
        exit $rc
    fi
done

ฉันทำเช่นนี้กับบาง 'การดำเนินการระยะไกล' ปพลิเคชันในสภาพแวดล้อมการทดสอบของฉันโดยใช้ Python ssh $userhost python < $pythonscriptfilenameแทนของเปลือก:


ขอบคุณสำหรับคำตอบ. ดูเหมือนว่า ฉันกำลังปรับมันเล็กน้อยและลองใช้ตอนนี้
Srikanth


3

จะทำให้มันง่ายและเรียกใช้ไฟล์ "แบทช์" ในคอมพิวเตอร์เครื่องอื่นได้อย่างไร

  1. scp batch-file user @ pc
  2. ssh user @ pc batch-file
  3. ssh user @ pc rm batch-file

และไฟล์แบตช์จะเป็นเชลล์สคริปต์ปกติดังนั้นจึงเป็นที่รู้จักกันดีในเรื่องไวยากรณ์


0

man expect? : \

แต่มันไม่ใช่วิธีที่สมบูรณ์แบบ


สวัสดี johnny8888 ฉันอยู่บนเซิร์ฟเวอร์ Solaris และไม่มีรายการที่คาดไว้ คุณช่วยอธิบายคำตอบของคุณให้ละเอียดได้ไหม?
Srikanth


@Srikanth: expectถูกออกแบบมาเพื่อโต้ตอบกับโปรแกรมที่คาดว่าจะทำงานบน terminal สิ่งนี้ไม่เกี่ยวข้องกับปัญหาของการรันคำสั่งผ่าน ssh
Gilles 'SO- หยุดความชั่วร้าย'


0

คุณสามารถใช้คำสั่งบังคับ ssh

สิ่งเหล่านี้เกี่ยวข้องกับคีย์เฉพาะ เมื่อการตรวจสอบสิทธิ์เสร็จสิ้นด้วยคีย์นั้นคำสั่งนั้นจะทำงานและการเชื่อมต่อจะออก ข้อดีอย่างหนึ่งของวิธีนี้คือความปลอดภัยที่เพิ่มขึ้นเนื่องจากในกรณีนี้คีย์ไม่สามารถใช้เพื่อเข้าสู่เชลล์การเข้าสู่ระบบได้


0

ตัวเลือกอื่นสำหรับสคริปต์โดย Arcegeจะเป็นฟังก์ชัน Bash:

sshbatch() {
  # Expect at least 2 parameters, if less are provided print help
  if [[ ${#@} -lt 2 ]]; then
    printf 'Usage: sshbatch [user@]host... input_file\n'
  else
    while read -r -u "$fd" host; do
      # Check if the last parameter is a readable file, else print error and exit
      [[ -r ${@:(-1)} ]] || { printf "The file ${@:(-1)} is not readable!\n"; break; }
      # Run remote bash from the file given in the last parameter
      ssh -o BatchMode=yes "$host" bash -s < "${@:(-1)}"
      # Read host list from 1st to next to last parameters
    done {fd}< <(printf '%s\n' "${@:1:${#@}-1}")
  fi
}

ฉันไม่ได้ใช้ ssh -Tตัวเลือกเพราะมันไม่สามารถใช้งานได้ในทุกกรณี

สคริปต์นี้ใช้การขยายพารามิเตอร์ในอาร์เรย์พารามิเตอร์ตำแหน่ง$@:

  • "${@:(-1)}" ขยายไปยังพารามิเตอร์สุดท้าย (แท้จริงฟอร์มแรกสิ้นสุดเป็นต้นไป)
  • "${#@}" ขยายเป็นจำนวนพารามิเตอร์ตำแหน่ง
  • "${@:1:${#@}-1}" ขยายไปยังรายการของพารามิเตอร์ทั้งหมดตั้งแต่แรกไปจนถึงสุดท้าย (จำนวนพารามิเตอร์น้อยกว่าหนึ่ง)

ฉันไม่เก่งเรื่องการขยายตัวของตัวแปรอย่างนั้นคุณจะสามารถเพิ่มสิ่งที่เกิดขึ้นได้ไหม? ไชโย
Guy

@ ซื้อคุณอยู่ที่นี่ - ฉันแสดงความคิดเห็นรหัสและเพิ่มคำอธิบายเกี่ยวกับการขยายตัวพารามิเตอร์
gadamiak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.