Làm thế nào để chạy các lệnh trong chế độ hàng loạt qua ssh?


9

Làm thế nào tôi có thể chạy các lệnh trong chế độ hàng loạt qua ssh? Đó là, sshtương đương của lệnh là sftp -b <filename> <hostname>gì?

Tôi có một bộ lệnh mà tôi muốn chạy trên một tập hợp các máy chủ kết nối qua ssh. Hơn sftp, tôi lưu trữ các lệnh trong một tệp filenamevà kết nối với máy chủ và chạy các lệnh bằng cách sử dụng lệnh đã đề cập trước đó.

Là một cái gì đó như thế có thể hơn ssh?


Tôi đã trải qua câu hỏi này . Nhưng tôi vẫn không thể tìm ra cách chạy các lệnh trong chế độ hàng loạt.
Srikanth

Và ai đó có thể vui lòng tạo một thẻ #batchmode và gắn thẻ câu hỏi này không?
Srikanth

Câu trả lời:


9

Sửa lỗi cho tôi nếu tôi sai, nhưng dường như bạn muốn chạy các lệnh shell thông thường trên máy chủ từ xa nơi tập lệnh là cục bộ.

#!/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

Tôi thực hiện điều này với một số ứng dụng 'thực thi từ xa' trong môi trường thử nghiệm của mình bằng Python thay vì shell : ssh $userhost python < $pythonscriptfilename.


cảm ơn câu trả lời Có vẻ như nó. Tôi đang điều chỉnh nó một chút và thử nó ngay bây giờ.
Srikanth

7

Tương đương với SSH sftp -b <filename> <hostname>sẽ là:

ssh -o BatchMode=yes <hostname> sh -s < "<filename>"


3

Làm thế nào để giữ cho nó đơn giản và chạy tệp "batch" trên máy tính khác?

  1. người dùng tập tin scp @ pc
  2. ssh user @ pc batch-file
  3. ssh user @ pc rm batch-file

Và tệp bó sẽ là một tập lệnh shell bình thường để cú pháp được biết đến.


0

man expect? : \

nhưng nó không phải là cách hoàn hảo


Xin chào johnny8888, tôi đang ở trên máy chủ Solaris và không có mục nhập thủ công nào để mong đợi. Bạn có thể vui lòng giải thích câu trả lời của bạn?
Srikanth


@Srikanth: expectđược thiết kế để tương tác với các chương trình dự kiến ​​sẽ chạy trên thiết bị đầu cuối. Điều này không liên quan đến vấn đề chạy các lệnh trên ssh.
Gilles 'SO- ngừng trở nên xấu xa'


0

Bạn có thể sử dụng các lệnh bắt buộc ssh.

Chúng được liên kết với một khóa cụ thể. Khi xác thực được thực hiện với khóa đó, lệnh đó sẽ được chạy và thoát kết nối. Một lợi thế của phương pháp này là tăng tính bảo mật, vì trong trường hợp đó, khóa không thể được sử dụng để lấy vỏ đăng nhập.


0

Một tùy chọn khác cho tập lệnh của Arcege sẽ là hàm 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
}

Tôi không sử dụng -Ttùy chọn của ssh , vì nó không hoạt động với nó trong mọi trường hợp.

Kịch bản lệnh này sử dụng mở rộng tham số trên mảng tham số vị trí $@:

  • "${@:(-1)}" mở rộng đến tham số cuối cùng (theo nghĩa đen là từ đầu đến cuối)
  • "${#@}" mở rộng đến số lượng tham số vị trí
  • "${@:1:${#@}-1}" mở rộng thành một danh sách tất cả các tham số từ đầu đến cuối đến cuối (nghĩa đen là số tham số ít hơn một).

Tôi không giỏi lắm về những mở rộng biến đổi như thế, bạn có thể thêm một chút vào những gì đang xảy ra không? Chúc mừng.
Guy

@Guy, bạn đây - Tôi đã nhận xét mã và thêm một số giải thích về việc mở rộng tham số
gadamiak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.