Không có TTY nào khi chạy các lệnh qua SSH trong tài liệu ở đây


10

Tôi đang cố chạy một lệnh trên SSH như thế này trong tài liệu ở đây:

ssh example.com <<END
sudo /etc/init.d/apache2 reload
END

Mà thường hoạt động trừ khi tôi đang cố chạy một cái gì đó cần đầu vào, chẳng hạn như mật khẩu cho sudo. Trong trường hợp đó, tôi nhận được thông báo sau:

sudo: no tty present and no askpass program specified

Tôi biết tôi có thể sử dụng -tcờ trên SSH để cấp phát một giả như thế này:

ssh -t example.com "sudo /etc/init.d/apache2 reload"

Và nó sẽ hoạt động, nhưng khi tôi thử điều tương tự với tài liệu ở đây, nó không hoạt động và tôi sẽ gặp lỗi tương tự về việc không có mặt nào:

ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END

Bất cứ ý tưởng làm thế nào tôi có thể làm cho công việc này?

Ngoài ra, trong trường hợp bạn đang tự hỏi tại sao tôi muốn nó hoạt động với tài liệu ở đây thay vì chỉ truyền nó trên cùng một dòng, thì đó là do các lệnh đầu vào (có thể có một vài) đến từ tệp cấu hình được đọc bởi tập lệnh và tôi đã nghe nói rằng nó tránh được những rắc rối trong việc thoát các lệnh cho dấu ngoặc kép, dấu ngoặc kép, v.v.

Câu trả lời:


6

Sử dụng visudođể chỉnh sửa tệp sudoers và chèn một dòng dưới đây:

Defaults:<user>    !requiretty

Nó không trả lời tại sao sử dụng ssh -t "something" versus ssh -t <<STOP something STOPkhông hoạt động. Giả sử tôi không sử dụng sudo nhưng tôi đang sử dụng passwd cho người dùng của riêng tôi, tôi vẫn sẽ không nhận được TTY bằng cách sử dụng heredoc.

Cố gắng ssh -t -tbuộc phân bổ giả ngay cả khi stdin không phải là thiết bị đầu cuối.


Cảm ơn, tôi đã thấy sửa lỗi này ở nơi khác, nhưng nó chỉ xoay quanh vấn đề đối với các lệnh sử dụng sudo. Nó không trả lời tại sao sử dụng ssh -t "cái gì đó" so với ssh -t << STOP cái gì đó STOP không hoạt động. Giả sử tôi không sử dụng sudo nhưng tôi đang sử dụng passwd cho người dùng của riêng tôi, tôi vẫn sẽ không nhận được TTY bằng cách sử dụng heredoc.
lpfavreau

Tôi đã cập nhật câu trả lời của mình.
lượng tử

1

Tại sao không chỉ đơn giản là lưu trữ tài liệu ở đây trong một biến sẽ được đưa ra ssh -tdưới dạng đối số lệnh.

Trên một ghi chú chung hơn, hãy sử dụng ssh -Thoặc chỉ định shell từ xa làm đối số lệnh nếu stdin của máy chủ từ xa đang được chuyển hướng từ một di sản (để tránh sshcố gắng phân bổ pty).

# store heredoc in a variable
heredoc="$(cat <<EOF
who
sudo ls -ld /
logname
EOF
)"

ssh -t localhost "$heredoc"


# avoid: Pseudo-terminal will not be allocated because stdin is not a terminal.
- ssh example.com <<END
+ ssh -T example.com <<END
+ ssh example.com /bin/sh <<END
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.