Tạo một kịch bản shell thực thi các lệnh trong telnet hoặc chương trình


7

Tôi muốn tạo một tập lệnh shell thực thi các lệnh trên thiết bị mà tôi telnet đến hoặc trong các chương trình như FTP hoặc OpenSSL. Tôi đã tìm thấy một phương thức trong FTP, nó sẽ trông giống như thế này:

#!/bin/sh
HOST='0.0.0.0'
USER='User'
PASSWD='Pass'
FILE='~/Desktop/file.txt'
RFILE='file.txt'

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
binary
passive
put $FILE $RFILE
quit
END_SCRIPT
exit 0

Làm cách nào tôi có thể làm điều gì đó tương tự với các thiết bị tôi telnet đến hoặc trong các chương trình khác nhau?


sử dụng expecthoặc viết tập lệnh perl sử dụng Expect.pm(hoặc một trong các Net::*mô-đun perl như Net::Telnethoặc Net:SSHv.v.) hoặc tập lệnh python sử dụng pexpect.
cas

@cas Tôi muốn bám vào shell script, vì nó không cần cài đặt bất cứ thứ gì và có thể di động trên các hệ thống UNIX khác.
TheBro21

Sau đó, thật tệ khi sh (trong bất kỳ biến thể nào của nó) không thực sự phù hợp với nhiệm vụ. có quá nhiều điều có thể sai (hoặc chỉ bất ngờ) mà một kịch bản sh chuyển hướng đơn giản không thể đối phó được. Có một lý do tại sao các công cụ như expectvà các công cụ khác mà tôi đã đề cập tồn tại - và đó là vì các tập lệnh shell không có khả năng thực hiện công việc một cách đáng tin cậy.
cas

@cas Nếu không có cách nào thì bạn có thể đưa ra câu trả lời khi tạo tập lệnh perl đó
TheBro21

bạn chưa cung cấp bất cứ nơi nào gần đủ chi tiết để viết bất kỳ loại kịch bản nào. tuy nhiên, điều đó không cần thiết - có rất nhiều ví dụ về các expecttập lệnh vv trên trang web này (và về lỗi tràn stack và serverfault). Bắt đầu với một số liên kết dưới tiêu đề Liên quan đến bên phải. và cũng tìm kiếm các trang web SE để mong đợi và / hoặc các thư viện perl và python tôi đã đề cập.
cas

Câu trả lời:


16

một thời gian trước tôi cần một cái gì đó tương tự. Bạn có thể thử với một cái gì đó như thế này:

#!/bin/sh

HOST='0.0.0.0'
USER='User'
PASSWD='Pass'
CMD=''

(
echo open "$HOST"
sleep 2
echo "$USER"
sleep 2
echo "$PASSWD"
sleep 2
echo "$CMD"
sleep 2
echo "exit"
) | telnet

PS1: Tôi sử dụng "ngủ 2" vì tôi đang truy cập qua vệ tinh. Nếu đó là mạng LAN, có lẽ bạn không cần "ngủ" chút nào.

PS2: chỉ cần nhập những gì bạn cần vào biến CMD


1
Cảm ơn bạn rất nhiều! Tôi đã phát điên khi cố gắng làm cho kỳ vọng và tự động khai thác công việc khi tôi có thể vừa làm điều đó! :)
NaturalBornCamper

Không có expectsẵn để làm việc với, giải pháp này giúp tôi rất đau đầu. Tôi chỉ cần đầu ra ngay lập tức telnet localhost 25để kiểm tra xem nó đang in gì, và chỉ cần đường ống usleep 10000để nó hoạt động tốt (làm cho nó ổn định và sau đó đóng kết nối). Cảm ơn bạn.
Joshua Detwiler
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.