2011-08-15 23 views
8

Tôi muốn sử dụng rsync cho máy chủ từ xa của mình mà tôi có quyền truy cập SSH. Tôi sử dụng lệnh sau:thoát rsync với thông báo "stdin không phải là một tty"

rsync -e 'ssh -p 22222' -rtz --delete content_dir/[email protected]:/home/user/public_html

Sau khi nhập lệnh , nó yêu cầu mật khẩu cho vị trí từ xa. Khi tôi gõ nó, nó thoát với thông điệp,

stdin: không phải là một tty

Làm thế nào để cung cấp mật khẩu để rsync? Phương pháp được đề xuất cũng nên hoạt động khi tôi sử dụng phương pháp này trong tập lệnh trình bao.

+0

Rõ ràng nó làm những gì nó được cho là phải làm. Quá trình chuyển tệp đã diễn ra thành công. Nhưng thông báo lỗi là gì và tôi có nên lo lắng về nó không? –

Trả lời

2

Mật khẩu được chấp nhận tại đây, như bạn đã tự tuyên bố rằng hoạt động không xảy ra.

Thông báo lỗi "stdin: không phải là tty" là do một cái gì đó trong tập lệnh khởi động trên máy chủ của bạn đang cố gắng xử lý một hành động chỉ xảy ra cho thông tin đăng nhập tương tác (khi bạn kết nối với ssh trực tiếp đến máy chủ, v.v.).

18

Bạn cần phải thêm:

[-z "$ PS1"] & & trở

đến beginig của .bashrc mà nằm ở thư mục nhà của bạn.

+2

Bạn có thể giải thích điều này thực sự làm được không? [-z "$ PS1"] làm gì? – rooby

+1

@rooby, lệnh đó sẽ kiểm tra xem shell có đang chạy tương tác hay không. Nếu vậy, nó sẽ thoát ngay lập tức. Điều này có ý nghĩa vì các công cụ trong tệp cấu hình bash không cần thiết cho các quy trình không tương tác, như rsync. –

1

[ -z "$PS1" ] && return giải quyết vấn đề nhưng nó kiểm tra xem độ dài chuỗi nhắc bằng 0 và nếu nó thoát rồi. Mặc dù $ PS1 sẽ không được đặt trong một hệ vỏ không tương tác, $ PS1 có độ dài bằng không cuối cùng không có nghĩa là hệ vỏ không tương tác.

Cách tiếp cận tốt hơn là kiểm tra các tùy chọn hiện tại của vỏ bằng cách sử dụng $-. Ví dụ: [[ $- != *i* ]] && return.

0

Trong trường hợp đơn giản return không thực hiện công việc, đây là một cách tiếp cận lấy từ this blog article:

if `tty -s`; then 
mesg n 
fi 
  • tty -s kiểm tra nếu có một TTY đính kèm (các -s nói với nó để làm như vậy âm thầm và chỉ thoát với mã trả về thích hợp). tty trả về giá trị tty đính kèm (ví dụ: "/ dev/pts/1"). Điều này sẽ an toàn hơn việc kiểm tra một số biến shell;)
  • mesg kiểm soát quyền ghi vào thiết bị đầu cuối của bạn (msg n không cho phép ghi vào đầu cuối (trong trường hợp không tồn tại) của chúng tôi).

Trên một số hệ thống (trong trường hợp của tôi Debian Jessie, nhưng cũng có những báo cáo về Ubuntu) mesg n được thiết lập vô điều kiện trong cả hai ~/.bashrc hay ~/.profile. Vì vậy, nếu nó tồn tại theo cách đó, điều này có thể là thủ phạm.

Giống như các ví dụ khác, bạn có thể làm cho một lớp lót: [[ $(tty -s) ]] && mesg n. Và không ai giúp bạn từ việc kết hợp hai:

if [[ $(tty -s) ]]; then 
    mesg n 
else 
    return 
fi 

Btw: Theo bài báo liên kết, đoạn này nên đi đến .bashrc của máy bạn kết nối - (the "từ xa") - vì vậy nếu đó là [email protected] , điều này sẽ được áp dụng khi bắt đầu /home/johndoe/.bashrc trên somehost. Trong trường hợp của tôi, tôi chỉ nhận được tin nhắn sau khi đã áp dụng thay đổi này trên "máy chủ gọi" là tốt.

PS: Ngoài ra, hãy kiểm tra .profile nếu nó có lệnh độc lập msg n (trong trường hợp của tôi). Nếu có, hãy quấn nó ở đó.


1:mesg n được sử dụng để ngăn chặn người dùng khác trên bằng văn bản máy tính để thiết bị đầu cuối hiện tại của bạn, mà mỗi gia nhập là một điều tốt - nhưng không hữu ích đối với một số rsync công việc;)

Các vấn đề liên quan