2012-12-18 7 views
11

Tôi đang cố viết một kịch bản lệnh shell để SSH vào máy chủ và sau đó nhắc người dùng nhập tệp/thư mục.SSH heredoc: bash prompt

ssh $SERVER <<EOF 
cd downloads/ 
read -e -p "Enter the path to the file: " FILEPATH 
echo $FILEPATH 
eval FILEPATH="$FILEPATH" 

echo "Downloading $FILEPATH to $CLIENT" 
EOF 

Tôi đang sử dụng heredoc thay vì dấu ngoặc kép sau SSH để thực thi các lệnh này vì tập lệnh shell của tôi khá lớn và tôi không muốn thoát từng dấu ngoặc kép.

Khi tôi đang sử dụng dấu ngoặc kép, dấu nhắc đã hoạt động tốt. Tuy nhiên, bây giờ tôi đang sử dụng heredoc, dấu nhắc không còn hoạt động nữa.

Tôi có thể làm gì để nhận lời nhắc làm việc với heredoc? Và nếu không muốn nói, là có cách nào tôi bố trí kịch bản của tôi để nhắc làm việc mà không cần gói tất cả mọi thứ trong dấu ngoặc kép và thoát, như vậy:

ssh $SERVER " 
cd downloads/ 
read -e -p \"Enter the path to the file: \" FILEPATH 
echo $FILEPATH 
eval FILEPATH=\"$FILEPATH\" 

echo \"Downloading $FILEPATH to $CLIENT\" 
exit 
" 

Trả lời

7

Nếu bạn không cần bất kỳ biến từ khách hàng, tại sao không thử - và ssh -t có thể có ích.

export CLIENT=me 

CMDS=$(cat <<CMD 
cd downloads/ 
read -e -p "Enter the path to the file: " FILEPATH 
echo \$FILEPATH 
eval FILEPATH="\$FILEPATH" 

echo "Downloading \$FILEPATH to $CLIENT" 
CMD 
) 

ssh localhost -t "$CMDS" 

Lưu ý rằng nếu vấn đề duy nhất của bạn trong dấu ngoặc kép là thoát, và bạn không có kế hoạch sử dụng ' dấu nháy đơn trong kịch bản của bạn, sau đó bạn có thể Ust làm điều này:

ssh -t $SERVER ' 
# your script, unescaped. 
# if you want access to a locally defined variable, 
echo "CLIENT is '$CLIENT'." 
' 
+0

Thay đổi nó thành '<< 'EOF'' chỉ đưa tôi đến dấu nhắc bash bên trong máy chủ SSH. Những gì tôi thực sự có nghĩa là bởi 'dấu nhắc' là: 'read -e -p' Nhập đường dẫn đến tập tin: "FILEPATH' - kịch bản sẽ nhắc người dùng cho một tập tin. –

+0

Ban đầu tôi đã sử dụng dấu nháy đơn, nhưng sau đó tôi không thể truy cập các biến như '$ CLIENT', được định nghĩa trước lệnh SSH. –

+0

Đã thêm đề xuất về dấu nháy đơn chưa thoát. xấu xí, nhưng tự hỏi liệu nó có hiệu quả với bạn không? – Faiz

2

công trình này, hoàn tab trên các công trình chủ.

var=$(cat<<EOF 
read -e -p Path pname; 
echo \$pname; 
hostname; 
echo \$pname; 
cd \$pname; 
pwd; 
touch THIS ; 
exit; 
EOF 
) 

ssh -t NODE $var 

trên mỏ điều này tạo tệp này trong thư mục được nhắc.

+0

Bằng lời nhắc, ý tôi là: 'read -e -p \" Nhập đường dẫn đến tệp: \ "FILEPATH' –

+0

thử phiên bản cập nhật. điều này làm việc với sự nhắc nhở. – kdubs

+0

nhưng lời nhắc đọc được chạy cục bộ, điều này không chính xác. – dogbane

1

Cái này dường như làm việc:

T=$(tty) ; bash <<XXX 
echo Hi "$T" 
read p <$T 
echo p: \$p 
echo Bye 
XXX 
+0

Làm thế nào một SSH tương đương với giao diện đó? –

0

Để làm cho nó làm việc với một heredoc, nó sẽ là đủ để gọi bash, hoặc bất kỳ vỏ bạn muốn sử dụng trên máy chủ từ xa. Cũng giống như vậy:

ssh $SERVER bash <<EOF 
cd downloads/ 
read -e -p "Enter the path to the file: " FILEPATH 
echo $FILEPATH 
eval FILEPATH="$FILEPATH" 

echo "Downloading $FILEPATH to $CLIENT" 
EOF 

Lưu ý rằng bạn có thể muốn thoát khỏi $ trên FILEPATH, vì hiện nay mà sẽ được nội suy bằng vỏ địa phương chứ không phải là vỏ từ xa.