Thiết bị đầu cuối giả sẽ không được phân bổ vì stdin không phải là thiết bị đầu cuối


345

Tôi đang cố gắng viết một tập lệnh shell tạo một số thư mục trên một máy chủ từ xa và sau đó sử dụng scp để sao chép các tập tin từ máy cục bộ của tôi vào điều khiển từ xa. Đây là những gì tôi có cho đến nay:

ssh -t user@server<<EOT
DEP_ROOT='/home/matthewr/releases'
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR=$DEP_ROOT"/"$datestamp
if [ ! -d "$DEP_ROOT" ]; then
    echo "creating the root directory"
    mkdir $DEP_ROOT
fi
mkdir $REL_DIR
exit
EOT

scp ./dir1 user@server:$REL_DIR
scp ./dir2 user@server:$REL_DIR

Bất cứ khi nào tôi chạy nó, tôi nhận được thông báo này:

Pseudo-terminal will not be allocated because stdin is not a terminal.

Và kịch bản chỉ bị treo mãi mãi.

Khóa công khai của tôi được tin cậy trên máy chủ và tôi có thể chạy tất cả các lệnh bên ngoài tập lệnh. Có ý kiến ​​gì không?


4
Bạn chỉ có thể chỉ định thiết bị đầu cuối để sử dụng nhưssh user@server /bin/bash <<EOT…
Buzut

3
@Buzut: Bạn có thể có nghĩa là vỏ , nhưng, vâng, chỉ định /bin/bashrõ ràng là một cách để tránh vấn đề.
mkuity0

1
@ mkuity0 thực sự, đó là những gì tôi muốn nói. Thx đã sửa lỗi đó;)
Buzut

Câu trả lời:


512

Hãy thử ssh -t -t(hoặc ssh -ttviết tắt) để buộc phân bổ giả ngay cả khi stdin không phải là thiết bị đầu cuối.

Xem thêm: Chấm dứt phiên SSH được thực thi bởi tập lệnh bash

Từ trang ssh:

-T      Disable pseudo-tty allocation.

-t      Force pseudo-tty allocation.  This can be used to execute arbitrary 
        screen-based programs on a remote machine, which can be very useful,
        e.g. when implementing menu services.  Multiple -t options force tty
        allocation, even if ssh has no local tty.

21
Tôi đang có một vấn đề tương tự trong một kịch bản được chạy ở đây. Tôi đã thêm -t -t nhưng bây giờ tôi đang gặp một lỗi mới. "tcgetattr: ioctl không phù hợp cho thiết bị"
MasterZ

5
Tại sao ssh -t -tvà không ssh -tt? Có một sự khác biệt mà tôi không nhận thức được?
Jack

3
@MasterZ Điều tương tự ở đây. Thật tuyệt khi nhận được câu trả lời cho điều nàyInappropriate IOCtl for device
krb686

11
@Jack -tt-t -ttương đương; việc chỉ định các đối số riêng biệt hoặc smooshed với nhau trở thành một vấn đề của phong cách / sở thích cá nhân và khi nói đến nó, có những lý lẽ hợp lệ để thực hiện theo một trong hai cách. nhưng thực sự, đó chỉ là sở thích cá nhân.
JDS

5
Điều đó có nghĩa là gì khi nó nói "ngay cả khi ssh không có tty cục bộ"?
CMCDragonkai

192

Ngoài ra với tùy chọn -Ttừ hướng dẫn

Vô hiệu hóa phân bổ giả


11
Câu trả lời này cần nhiều điểm hơn - đó là câu trả lời đúng và không quá dài như câu trả lời của zanco, thật phi lý khi "ôi phân bổ một TTY dù sao với -t -t" được 107 điểm, khi bạn có thể bỏ qua nó hoàn toàn
nhed

2
Chỉ cần nâng cao; nó đã làm việc tốt hơn cho tôi so với -t -t
Vincent Hiribarren

15
'-t -t' hoạt động, tuy nhiên với '-T' tôi nhận được 'sudo: xin lỗi, bạn phải có một tty để chạy sudo'
Ivan Balashov

3
@nhed: -ttTùy chọn xuất hiện tốt nhất cho những người thực sự muốn có TTY và nhận được thông báo lỗi của OP. Đây -Ttrả lời là tốt hơn nếu bạn không cần TTY.
ErichBSchulz

3
@nhed - chắc chắn - nhưng tôi chắc rằng những người khác như tôi đã đến đây từ việc xử lý lỗi trong thông báo lỗi. Có vẻ như không hợp lý để làm rõ cách các nhân viên khác nên chọn giữa 2 câu trả lời cạnh tranh. hoặc có thể không. tôi không biết
ErichBSchulz

90

Theo câu trả lời của zanco , bạn không cung cấp lệnh từ xa ssh, cho biết cách shell phân tích dòng lệnh. Để giải quyết vấn đề này, hãy thay đổi cú pháp của sshlệnh gọi lệnh của bạn để lệnh từ xa bao gồm một chuỗi nhiều dòng chính xác về mặt cú pháp.

Có một loạt các cú pháp có thể được sử dụng. Ví dụ, vì các lệnh có thể được dẫn vào bashsh, và có lẽ các shell khác cũng vậy, giải pháp đơn giản nhất là chỉ kết hợp lệnh sshgọi shell với heredocs:

ssh user@server /bin/bash <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT

Lưu ý rằng thực hiện các điều trên mà không có /bin/bash kết quả cảnh báo Pseudo-terminal will not be allocated because stdin is not a terminal. Cũng lưu ý rằng EOTđược bao quanh bởi các dấu ngoặc đơn, để bashnhận ra heredoc là nowdoc , tắt nội suy biến cục bộ để văn bản lệnh sẽ được chuyển như nguyên trạng ssh.

Nếu bạn là một fan hâm mộ của đường ống, bạn có thể viết lại như trên:

cat <<'EOT' | ssh user@server /bin/bash
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT

Cùng cảnh báo về /bin/basháp dụng cho ở trên.

Một cách tiếp cận hợp lệ khác là truyền lệnh từ xa nhiều dòng dưới dạng một chuỗi, sử dụng nhiều lớp bashnội suy biến đổi như sau:

ssh user@server "$( cat <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
)"

Giải pháp trên khắc phục vấn đề này theo cách sau:

  1. ssh user@serverđược phân tích cú pháp bởi bash và được hiểu là sshlệnh, theo sau là một đối số user@serverđược truyền cho sshlệnh

  2. "bắt đầu một chuỗi nội suy, khi hoàn thành, sẽ bao gồm một đối số được truyền cho sshlệnh, trong trường hợp này sẽ được hiểu sshlà lệnh từ xa để thực thi như làuser@server

  3. $( bắt đầu một lệnh được thực thi, với đầu ra được bắt bởi chuỗi nội suy xung quanh

  4. catlà một lệnh để xuất nội dung của bất kỳ tập tin nào sau đây. Đầu ra của catsẽ được chuyển trở lại vào chuỗi nội suy bắt giữ

  5. <<bắt đầu một bash heredoc

  6. 'EOT'xác định rằng tên của di truyền là EOT. Các trích dẫn đơn 'xung quanh EOT chỉ định rằng heredoc nên được phân tích cú pháp dưới dạng nowdoc , đây là một dạng đặc biệt của heredoc trong đó các nội dung không bị nội suy bởi bash, mà được truyền theo định dạng bằng chữ

  7. Bất kỳ nội dung nào gặp phải giữa <<'EOT'<newline>EOT<newline>sẽ được thêm vào đầu ra nowdoc

  8. EOTchấm dứt nowdoc, dẫn đến một tập tin tạm thời nowdoc được tạo và chuyển trở lại catlệnh gọi . catxuất ra nowdoc và chuyển đầu ra trở lại chuỗi nội suy bắt giữ

  9. ) kết luận lệnh sẽ được thực thi

  10. "kết luận chuỗi nội suy bắt giữ. Nội dung của chuỗi nội suy sẽ được chuyển trở lại sshdưới dạng một đối số dòng lệnh, sshsẽ hiểu là lệnh từ xa để thực thi nhưuser@server

Nếu bạn cần tránh sử dụng các công cụ bên ngoài như cat, và đừng readbận tâm đến việc có hai câu lệnh thay vì một câu lệnh, hãy sử dụng tích hợp sẵn với một di sản để tạo lệnh SSH:

IFS='' read -r -d '' SSH_COMMAND <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT

ssh user@server "${SSH_COMMAND}"

+1 một năm rưỡi sau! :) giải thích thực sự rõ ràng. làm tốt lắm
yaroslavTir

1
Đối với tôi (và tôi không có nghĩa là một người "DevOps") đây là những gì đã hoạt động (tôi đang sử dụng Jenkins). Tôi cũng đã thử các đề xuất "-t -t" và "-T", nhưng gặp vấn đề về luồng mở và các vấn đề không thực thi.
Ryan phi hành đoàn

2 năm sau, thực sự hữu ích
jack-nie

+1 giải thích tuyệt vời. Nhưng nếu bạn tạo đoạn mã cuối cùng (IFS = '' *) một hàm để thực thi các lệnh từ xa, làm thế nào bạn chuyển $ 1 vào IFS = '' *? Nó ngoan ngoãn dường như nhận ra nội dung của $ 1.
Cristian Matthias Ambæk

1
@ mkuity0 Chắc chắn, bạn có thể thoát các chuỗi khi cần, nhưng ai muốn rắc rối khi phải sửa đổi các câu lệnh script mà bạn có thể đang sao chép và dán từ một tập lệnh shell khác, hoặc stackoverflow cho vấn đề đó? Ngoài ra, sự thanh lịch của catgiải pháp là nó được thực hiện trong một tuyên bố (mặc dù là hợp chất) và không dẫn đến các biến tạm thời gây ô nhiễm môi trường vỏ.
Dejay Clayton

63

Tôi đang thêm câu trả lời này vì nó đã giải quyết một vấn đề liên quan mà tôi gặp phải với cùng một thông báo lỗi.

Vấn đề : Tôi đã cài đặt cygwin trong Windows và gặp lỗi này:Pseudo-terminal will not be allocated because stdin is not a terminal

Giải pháp : Hóa ra tôi chưa cài đặt chương trình và tiện ích máy khách openssh. Do đó, Cygwin đã sử dụng Windows để thực hiện ssh chứ không phải phiên bản cygwin. Giải pháp là cài đặt gói cygwin openssh.


10
Đối với tôi, hóa ra đó là một triển khai ssh khác trong PATH:$ which ssh/cygdrive/c/Program Files (x86)/Git/bin/ssh
FelixJongleur42 16/12/14

và để cài đặt, opensshđây có thể là cách dành cho Windows: superuser.com/a/301026/260710
Andreas Dietrich

Giải pháp này hiệu quả với tôi. Sau khi cài đặt openssh, vấn đề không còn nữa.
jdhao

34

Thông điệp cảnh báo Pseudo-terminal will not be allocated because stdin is not a terminal.là do không có lệnh nào được chỉ định sshtrong khi stdin được chuyển hướng từ một tài liệu ở đây. Do thiếu một lệnh được chỉ định làm đối số sshtrước tiên mong đợi một phiên đăng nhập tương tác (sẽ yêu cầu phân bổ pty trên máy chủ từ xa) nhưng sau đó phải nhận ra rằng stdin cục bộ của nó không có tty / pty. Việc chuyển hướng sshstdin từ một tài liệu ở đây thường yêu cầu một lệnh (chẳng hạn như /bin/sh) được chỉ định làm đối số cho ssh- và trong trường hợp như vậy, sẽ không có pty nào được phân bổ trên máy chủ từ xa theo mặc định.

Vì không có lệnh nào được thực thi thông qua sshyêu cầu sự hiện diện của tty / pty (chẳng hạn như vimhoặc top), việc -tchuyển đổi thành sshkhông cần thiết. Chỉ cần sử dụng ssh -T user@server <<EOT ...hoặc ssh user@server /bin/bash <<EOT ...cảnh báo sẽ biến mất.

Nếu các biến <<EOFkhông được thoát hoặc trích dẫn đơn (tức là <<\EOThoặc <<'EOT') trong tài liệu ở đây sẽ được mở rộng bởi shell cục bộ trước khi nó được thực thi ssh .... Hiệu quả là các biến trong tài liệu ở đây sẽ vẫn trống vì chúng chỉ được xác định trong shell từ xa.

Vì vậy, nếu $REL_DIRcả hai có thể truy cập được bởi shell cục bộ và được xác định trong shell từ xa, $REL_DIRphải được xác định bên ngoài tài liệu ở đây trước sshlệnh ( phiên bản 1 bên dưới); hoặc, nếu <<\EOThoặc <<'EOT'được sử dụng, đầu ra của sshlệnh có thể được chỉ định REL_DIRnếu đầu ra duy nhất của sshlệnh tới thiết bị xuất chuẩn được tạo ra bởi echo "$REL_DIR"bên trong tài liệu thoát / trích dẫn đơn ở đây ( phiên bản 2 bên dưới).

Tùy chọn thứ ba sẽ là lưu trữ tài liệu ở đây trong một biến và sau đó chuyển biến này làm đối số lệnh cho ssh -t user@server "$heredoc"( phiên bản 3 bên dưới).

Và, cuối cùng nhưng không kém phần quan trọng, sẽ không có ý tưởng tồi để kiểm tra xem các thư mục trên máy chủ từ xa đã được tạo thành công hay chưa (xem: kiểm tra xem tệp có tồn tại trên máy chủ từ xa với ssh không ).

# version 1

unset DEP_ROOT REL_DIR
DEP_ROOT='/tmp'
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR="${DEP_ROOT}/${datestamp}"

ssh localhost /bin/bash <<EOF
if [ ! -d "$DEP_ROOT" ] && [ ! -e "$DEP_ROOT" ]; then
   echo "creating the root directory" 1>&2
   mkdir "$DEP_ROOT"
fi
mkdir "$REL_DIR"
#echo "$REL_DIR"
exit
EOF

scp -r ./dir1 user@server:"$REL_DIR"
scp -r ./dir2 user@server:"$REL_DIR"


# version 2

REL_DIR="$(
ssh localhost /bin/bash <<\EOF
DEP_ROOT='/tmp'
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR="${DEP_ROOT}/${datestamp}"
if [ ! -d "$DEP_ROOT" ] && [ ! -e "$DEP_ROOT" ]; then
   echo "creating the root directory" 1>&2
   mkdir "$DEP_ROOT"
fi
mkdir "$REL_DIR"
echo "$REL_DIR"
exit
EOF
)"

scp -r ./dir1 user@server:"$REL_DIR"
scp -r ./dir2 user@server:"$REL_DIR"


# version 3

heredoc="$(cat <<'EOF'
# -onlcr: prevent the terminal from converting bare line feeds to carriage return/line feed pairs
stty -echo -onlcr
DEP_ROOT='/tmp'
datestamp="$(date +%Y%m%d%H%M%S)"
REL_DIR="${DEP_ROOT}/${datestamp}"
if [ ! -d "$DEP_ROOT" ] && [ ! -e "$DEP_ROOT" ]; then
   echo "creating the root directory" 1>&2
   mkdir "$DEP_ROOT"
fi
mkdir "$REL_DIR"
echo "$REL_DIR"
stty echo onlcr
exit
EOF
)"

REL_DIR="$(ssh -t localhost "$heredoc")"

scp -r ./dir1 user@server:"$REL_DIR"
scp -r ./dir2 user@server:"$REL_DIR"

5
Cảm ơn bạn đã giải thích rất chi tiết về ý nghĩa của lỗi này và tại sao nó xuất hiện khi sử dụng một di sản, điều này giúp tôi thực sự hiểu về nó hơn là chỉ giải quyết nó.
Dan

29

Tất cả thông tin liên quan đều có trong các câu trả lời hiện có, nhưng hãy để tôi thử tóm tắt thực tế :

tl; dr:

  • DO truyền các lệnh để chạy bằng đối số dòng lệnh :
    ssh jdoe@server '...'

    • '...' các chuỗi có thể trải rộng trên nhiều dòng, vì vậy bạn có thể giữ mã của mình có thể đọc được ngay cả khi không sử dụng tài liệu ở đây:
      ssh jdoe@server ' ... '
  • KHÔNG chuyển các lệnh qua stdin , như trường hợp khi bạn sử dụng tài liệu ở đây :
    ssh jdoe@server <<'EOF' # Do NOT do this ... EOF

Truyền các lệnh như một đối số hoạt động như hiện trạng và:

  • vấn đề với thiết bị đầu cuối giả thậm chí sẽ không phát sinh.
  • bạn sẽ không cần một exitcâu lệnh ở cuối các lệnh của mình, vì phiên sẽ tự động thoát sau khi các lệnh được xử lý.

Nói tóm lại: truyền lệnh qua stdin là một cơ chế mâu thuẫn với sshthiết kế của nó và gây ra các vấn đề sau đó phải được xử lý.
Đọc tiếp, nếu bạn muốn biết thêm.


Thông tin cơ bản tùy chọn:

sshCơ chế chấp nhận các lệnh để thực thi trên máy chủ đích là một đối số dòng lệnh : toán hạng cuối cùng (đối số không tùy chọn) chấp nhận một chuỗi chứa một hoặc nhiều lệnh shell.

  • Theo mặc định, các lệnh-T này chạy không giám sát, trong một vỏ không tương tác , không sử dụng đầu cuối (giả) (tùy chọn được ngụ ý) và phiên sẽ tự động kết thúc khi lệnh cuối cùng kết thúc xử lý.

  • Trong trường hợp các lệnh của bạn yêu cầu tương tác người dùng , chẳng hạn như trả lời lời nhắc tương tác, bạn có thể yêu cầu rõ ràng việc tạo pty (pseudo-tty) , thiết bị đầu cuối giả, cho phép tương tác với phiên từ xa, sử dụng -ttùy chọn; ví dụ:

    • ssh -t jdoe@server 'read -p "Enter something: "; echo "Entered: [$REPLY]"'

    • Lưu ý rằng readlời nhắc tương tác chỉ hoạt động chính xác với pty, vì vậy -ttùy chọn là cần thiết.

    • Sử dụng pty có tác dụng phụ đáng chú ý: thiết bị xuất chuẩn và thiết bị xuất chuẩn được kết hợp và cả hai được báo cáo qua thiết bị xuất chuẩn ; nói cách khác: bạn mất sự phân biệt giữa đầu ra thông thường và lỗi; ví dụ:

      • ssh jdoe@server 'echo out; echo err >&2' # OK - stdout and stderr separate

      • ssh -t jdoe@server 'echo out; echo err >&2' # !! stdout + stderr -> stdout

Trong trường hợp không có đối số này, hãy sshtạo một vỏ tương tác - bao gồm cả khi bạn gửi lệnh qua stdin , đó là nơi rắc rối bắt đầu:

  • Đối với hệ vỏ tương tác , sshthông thường sẽ phân bổ pty (pseudo-terminal) theo mặc định, trừ khi stdin của nó không được kết nối với thiết bị đầu cuối (thực).

    • Gửi lệnh qua stdin có nghĩa sshlà stdin không còn được kết nối với thiết bị đầu cuối, do đó, không có pty nào được tạo và ssh cảnh báo bạn theo đó :
      Pseudo-terminal will not be allocated because stdin is not a terminal.

    • Ngay cả -ttùy chọn, với mục đích rõ ràng là yêu cầu tạo ra một pty, cũng không đủ trong trường hợp này : bạn sẽ nhận được cảnh báo tương tự.

      • Hơi tò mò, sau đó bạn phải tăng gấp đôi sự -tlựa chọn để tạo ra sức mạnh của một pty: ssh -t -t ...hoặc ssh -tt ...chương trình mà bạn thực sự, thực sự có nghĩa là nó .

      • Có lẽ lý do để yêu cầu bước rất cân nhắc này là mọi thứ có thể không hoạt động như mong đợi . Chẳng hạn, trên macOS 10.12, tương đương rõ ràng của lệnh trên, cung cấp các lệnh thông qua stdin và sử dụng -tt, không hoạt động đúng; phiên bị kẹt sau khi trả lời lời readnhắc:
        ssh -tt jdoe@server <<<'read -p "Enter something: "; echo "Entered: [$REPLY]"'


Trong trường hợp không chắc là các lệnh bạn muốn chuyển làm đối số sẽ tạo dòng lệnh quá dài cho hệ thống của bạn (nếu độ dài của nó tiếp cận getconf ARG_MAX- xem bài viết này ), trước tiên hãy xem xét việc sao chép mã vào hệ thống từ xa dưới dạng tập lệnh ( bằng cách sử dụng, ví dụ, scp) và sau đó gửi lệnh để thực thi tập lệnh đó.

Trong một nhúm, sử dụng -Tvà cung cấp các lệnh thông qua stdin , với một exitlệnh trailing , nhưng lưu ý rằng nếu bạn cũng cần các tính năng tương tác, sử dụng -ttthay cho -Tcó thể không hoạt động.


1
Điều này hoạt động hoàn hảo, cách -tt là làm cho thiết bị đầu cuối hiển thị mọi lệnh được gửi qua ssh.
Đánh dấu

1
"nhân đôi tùy chọn -t để buộc tạo pty: ssh -t -t ... hoặc ssh -tt ... cho thấy rằng bạn thực sự, thực sự có ý đó." - ha, ha - nhờ nó buồn cười nhưng nghiêm trọng quá - Tôi không thể có được đầu của tôi quanh t đôi tất cả tôi biết là nếu tôi đặt trong một t đơn nó không wrok
DavidC

22

Tôi không biết hang đến từ đâu, nhưng chuyển hướng các lệnh (hoặc đường ống) vào một ssh tương tác nói chung là một công thức cho các vấn đề. Sẽ mạnh mẽ hơn khi sử dụng kiểu đối số lệnh-to-run-as-a-last-argument và truyền tập lệnh trên dòng lệnh ssh:

ssh user@server 'DEP_ROOT="/home/matthewr/releases"
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR=$DEP_ROOT"/"$datestamp
if [ ! -d "$DEP_ROOT" ]; then
    echo "creating the root directory"
    mkdir $DEP_ROOT
fi
mkdir $REL_DIR'

(Tất cả trong một 'đối số dòng lệnh đa dòng khổng lồ ).

Thông báo thiết bị đầu cuối giả là do bạn -tyêu cầu ssh cố gắng làm cho môi trường mà nó chạy trên máy từ xa trông giống như một thiết bị đầu cuối thực sự cho các chương trình chạy ở đó. Máy khách ssh của bạn đang từ chối làm điều đó bởi vì đầu vào tiêu chuẩn của chính nó không phải là một thiết bị đầu cuối, vì vậy nó không có cách nào để chuyển các API thiết bị đầu cuối đặc biệt trở đi từ máy từ xa đến thiết bị đầu cuối thực tế của bạn ở đầu cục bộ.

Bạn đang cố gắng đạt được điều -tgì?


1
Tùy chọn -t là một nỗ lực để khắc phục sự cố thiết bị đầu cuối Psuedo (nó không hoạt động). Tôi đã thử giải pháp của bạn, nó đã thoát khỏi thiết bị đầu cuối psuedo nhưng bây giờ nó chỉ bị treo ...
Matthew

4
@Henning: Bạn có thể vui lòng xây dựng hoặc cung cấp một liên kết liên quan đến những bất lợi của việc chuyển hướng hoặc đường ống vào một ssh tương tác?
Isaac Kleinman

hơi muộn nhưng: ở đây bạn không cần thiết bị đầu cuối giả, vì vậy hãy sử dụng tùy chọn -Tthay thế.
Florian Castellane

6

Sau khi đọc rất nhiều câu trả lời này, tôi nghĩ rằng tôi sẽ chia sẻ giải pháp kết quả của mình. Tất cả tôi đã thêm là /bin/bashtrước khi di truyền và nó không đưa ra lỗi nữa.

Dùng cái này:

ssh user@machine /bin/bash <<'ENDSSH'
   hostname
ENDSSH

Thay vì điều này (đưa ra lỗi):

ssh user@machine <<'ENDSSH'
   hostname
ENDSSH

Hoặc sử dụng cái này:

ssh user@machine /bin/bash < run-command.sh

Thay vì điều này (đưa ra lỗi):

ssh user@machine < run-command.sh

VƯỢT TRỘI :

Nếu bạn vẫn muốn một lời nhắc tương tác từ xa, ví dụ: nếu tập lệnh bạn đang chạy từ xa sẽ nhắc bạn nhập mật khẩu hoặc thông tin khác, vì các giải pháp trước đó sẽ không cho phép bạn nhập vào lời nhắc.

ssh -t user@machine "$(<run-command.sh)"

Và nếu bạn cũng muốn đăng nhập toàn bộ phiên trong một tệp logfile.log:

ssh -t user@machine "$(<run-command.sh)" | tee -a logfile.log

0

Tôi đã gặp lỗi tương tự trong Windows khi sử dụng emacs 24.5.1 để kết nối với một số máy chủ của công ty thông qua / ssh: user @ host. Điều đã giải quyết vấn đề của tôi là đặt biến "tramp-default-method" thành "plink" và bất cứ khi nào tôi kết nối với máy chủ, tôi đều sử dụng giao thức ssh. Bạn cần cài đặt plink.exe của PuTTY để làm việc này.

Giải pháp

  1. Biến tùy chỉnh Mx (và sau đó nhấn Enter)
  2. phương thức tramp-default-method (và sau đó nhấn Enter lần nữa)
  3. Trên trường văn bản, hãy đặt plink và sau đó Áp dụng và Lưu bộ đệm
  4. Bất cứ khi nào tôi cố gắng truy cập một máy chủ từ xa, bây giờ tôi sử dụng Cxf / user @ host: và sau đó nhập mật khẩu. Kết nối hiện được thực hiện chính xác theo Emacs trên Windows đến máy chủ từ xa của tôi.

-3

ssh -t foobar @ localhost của bạncript.pl


2
OP -tcũng sử dụng , nhưng trong kịch bản cụ thể của họ là không đủ, điều đó đã khiến câu hỏi bắt đầu.
mkuity0
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.