2012-09-20 26 views
8

Tôi muốn sử dụng expect để chạy một lệnh đơn giản cat /tmp/id_rsa.pub qua ssh.sử dụng mong đợi để sinh ra lệnh với đối số có chứa dấu cách

Trong một vỏ, tôi có thể chạy này wo vấn đề, (với tay đưa vào mật khẩu)

ssh [email protected] 'cat /tmp/id_rsa.pub' 

tôi muốn tự động hoá này với expect. Mã số của tôi expect là,

#!/usr/bin/expect 
eval spawn ssh [email protected] 'cat /tmp/id_rsa.pub' 
expect "password:" 
send "123456" 
expect eof 

Nó ném lỗi bash: cat /tmp/id_rsa.pub: no such file or directory. có vẻ rất lạ với tôi. Nguyên nhân có thể là gì?

Chỉnh sửa: sau một số thử nghiệm, tôi thấy điều này là phổ biến, không chỉ trong trường hợp của cat. Nếu đối số để sinh ra lệnh là với không gian (ngay cả khi nó trong dấu ngoặc kép), nó sẽ có vấn đề. Ví dụ, thay thế cat /tmp/id_rsa.pub với các lệnh khác với không gian, giống như

eval spawn ssh [email protected] 'which java' 

nó than phiền với bash: which java: command not found. Nhưng nếu thay thế mà với pwd, như

eval spawn ssh [email protected] 'pwd' 

nó hoạt động tốt.

+3

Bạn đã thử xóa dấu nháy đơn xung quanh 'đối số lệnh'? Có vẻ như gốc của vấn đề là nó đang cố gắng giải thích toàn bộ chuỗi được trích dẫn như tên của một lệnh, thay vì tách nó thành lệnh và đối số ... – twalberg

+0

@twalberg đang hoạt động. Tôi cũng đã thử báo giá đôi, wo/vấn đề là tốt. Chỉ cần ra khỏi tò mò, u có thể giải thích một chút những gì đặc biệt về dấu nháy đơn? – Richard

+0

Tôi phải đào các tài liệu 'mong đợi' để xem những gì nó nói - không biết ngoài đỉnh đầu của tôi. Tôi đề xuất rằng dựa trên cú pháp của thông báo lỗi cụ thể mà bạn đang nhận được ... – twalberg

Trả lời

0

Tôi đoán bạn không yêu cầu eval tại đó. Loại bỏ nó và kiểm tra.

Kiểm tra điều này expect examples link để biết ví dụ chi tiết về "cách sử dụng expect?" .

Hy vọng điều này sẽ hữu ích.

+0

Tôi đã thử mà không có '' eval'', nhưng không thành công. – Richard

3

Trích dẫn đơn (') không có ý nghĩa đặc biệt để Mong đợi, không giống như sh và các trình bao tương thích khác.
Điều này có nghĩa rằng bạn Statment

spawn ssh [email protected] 'cat /tmp/id_rsa.pub' 

được phân tách thành những lời sau đây:

  • spawn
  • ssh
  • [email protected]
  • 'cat - không cho đến khi dấu nháy đơn khác.
  • /tmp/id_rsa.pub'

Việc sử dụng trong sh là nhóm này cho một đối số duy nhất. Trong Tcl, bạn có thể sử dụng dấu ngoặc kép (") hoặc dấu ngoặc nhọn ({}). Bên trong dấu ngoặc kép, biến Tcl sẽ được thay thế, trong khi nội dung bên trong {} được chuyển mà không có bất kỳ sự thay thế nào .

tl; dr Tương đương mong đợi/Tcl của sh '{}.

A \ trước khi dòng mới vẫn được thay thế.

2

Như Johannes đã nói, sử dụng ' không hoạt động.
Tôi đã gặp phải sự cố tương tự, nhưng tôi muốn thực thi thêm lệnh và sau đó vẫn nhận được trình đăng nhập. Tôi đã quản lý để làm cho nó hoạt động với ":

expect -c " 
    set timeout 5; 
    spawn ssh -XY [email protected]$host -t \"cat /etc/motd; bash -l\" 
    expect { 
     -re \"^Warning.*\" {exp_continue} 
     -re \"^.*sword: \" {send \"${PASSWORDS[$user]}\r\"; interact} 
    } 
" 
Các vấn đề liên quan