Cách ghi từ xa vào tệp bằng SSH


41

Tôi có thể sao chép tệp vào máy Linux từ xa mà không gặp vấn đề gì với

scp file user@host: /pathtowrite_file

Tuy nhiên, tôi gặp khó khăn khi ghi vào một tệp từ máy linux này sang máy khác. Đây là những gì tôi đã cố gắng:

echo 'Some Text' > /remotefile.txt | ssh user@remotehost

Thông báo mà tôi nhận được là

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

Ở mọi mức độ, tệp trên máy từ xa không phản ánh văn bản được gửi 'Một số văn bản'.

Câu trả lời:


70

Bạn có thể sử dụng lệnh "cat" để tạo tập tin từ xa.

echo 'Some Text' | ssh user@remotehost -T "cat > /remotefile.txt"

Việc -Tvô hiệu hóa phân bổ thiết bị đầu cuối giả và ngăn bạn nhận được tin nhắn,

Pseudo-terminal sẽ không được phân bổ vì stdin không phải là terminal.


nhưng, tôi muốn ghi vào tập tin hiện có trên máy từ xa.
acha

2
"cat> /remotefile.txt" chạy trên máy từ xa và nếu bạn muốn thêm vào tệp hiện có, bạn thay thế ">" bằng ">>"
Aragorn

@suffa: Bạn đang cố gắng thêm vào một tập tin hiện có? Hoặc bạn muốn ghi đè lên tệp nhưng không thành công nếu nó không tồn tại? Hay cái gì?
David Schwartz

@ David Schwartz - một trong hai. Tôi muốn ghi đè lên và thất bại nếu nó không thoát ... nhưng, tôi sẽ chỉ thêm vào lúc này.
acha

`echo 'Một số văn bản' | ssh user @ remotehost" tee -a /remotefile.txt "` cũng hoạt động với tôi.
Đơn giản chỉ cần Seth

10

Ngắn hơn một chút so với câu trả lời khác:

ssh user@remotehost "echo Some Text > /remotefile.txt"

3
Thật; điều này sẽ hoạt động - nếu việc viết một dòng văn bản vào tệp từ xa thực sự là tất cả những gì OP muốn làm. Lệnh trong câu hỏi trông giống như một bài kiểm tra bằng chứng về khái niệm. Câu hỏi cho biết, "ghi vào một tệp từ máy Linux này sang máy khác." Nếu người dùng muốn chạy một lệnh tùy ý (hoặc chuỗi lệnh) - và không chỉ là một echo- cục bộ, thì câu trả lời của bạn không có ích, và câu trả lời được chấp nhận là cách thực hiện.
Scott

@Scott Nhiều lệnh cũng có thể sử dụng phương pháp này. Giống như hầu hết mọi thứ Linux, TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r

Anh chàng lạnh lùng, cảm ơn vì downvote. Tôi đoán điều đó dễ hơn là thực sự giải quyết quan điểm của tôi? PS bình luận của bạn ở trên không có ý nghĩa.
g33kz0r

1
OK, bạn muốn chỉ trích nhiều hơn? (1) Tại sao trên thế giới bạn đang nói ssh localhost? Đó chỉ là làm vấy bẩn nước, không làm cho nó rõ ràng hơn. (2) Bằng cách không hiển thị chuyển hướng trong ví dụ đã sửa đổi của bạn, bạn đặt ra câu hỏi liệu bạn có biết cách nhóm các lệnh và gửi tất cả đầu ra cho một tệp không. Tiết (Cont'd)
Scott

1
(Tiếp theo) Khác (3) Bạn đã bỏ lỡ quan điểm của mình, bằng cách tập trung vào cụm từ một dòng văn bản duy nhất. Quan điểm của tôi là OP có thể muốn làm một cái gì đó tinh vi hơn khi viết văn bản đã biết vào tệp từ xa - anh ta có thể muốn chạy một lệnh cục bộ và gửi đầu ra đến tệp từ xa, như trong . Nếu bạn có thể điều chỉnh câu trả lời của mình để giải quyết trường hợp chung đó, vui lòng làm như vậy. command (localhost) > file (remotehost)
Scott

6

Cũng có thể sử dụng dd để thêm vào một tập tin. Có thể hơi mơ hồ nhưng hữu ích nếu chuyển hướng đầu ra trên máy chủ từ xa là không thể.

cat ~/.ssh/id_rsa.pub | ssh user@remote.host 'dd of=.ssh/authorized_keys oflag=append conv=notrunc'

Ví dụ này nối thêm khóa công khai của bạn vào tệp ủy quyền trên máy chủ từ xa.

(Nguồn: http://www.rsync.net/resource/howto/ssh_keys.html )


3

Thao tác này sẽ lấy nội dung trong bảng tạm của bạn trên máy Mac và nối nó vào cuối tệp từ xa:

pbpaste | ssh root@my.machine.remote 'cat >> ~/.ssh/authorized_keys'

Điều này cho phép bạn viết (nối) vào cuối tệp trên máy chủ từ xa:

echo "Append string to file" | ssh root@my.machine.remote 'cat >> ~/.ssh/authorized_keys'

1

Nếu phải sử dụng nhiều lần có thể dễ sử dụng mã này hơn. Với công cụ "sshpass", ssh sẽ không nhắc bạn nhập mật khẩu cho mỗi lần gọi tập lệnh. (trừ khi bạn cần giữ bí mật, tốt hơn hết là không sử dụng nó)

Để biết thêm thông tin về sshpass: https://stackoverflow.com/questions/12202587/automatically-enter-ssh-password-with-script

#!/bin/bash

SCRIPT="echo 'nameserver 8.8.8.8' > /etc/resolv.conf"        

if [ "$#" -ne 1 ]; then
        echo "Wrong number of arguments. usage: prog dest_machine"
else
        sshpass -p "root" ssh -o StrictHostKeyChecking=no root@"$1" "${SCRIPT}"
fi

Trực quan hơn những gì? Điều này về cơ bản giống như câu trả lời của g33kz0r (từ gần hai năm trước), cộng với một số tiếng chuông và tiếng còi không đặc biệt rõ ràng. Ít nhất là giải thích những thứ bạn đã thêm.
Scott

Nếu tập lệnh của bạn được gọi với quá nhiều đối số, nó sẽ đưa ra một thông báo lỗi nói rằng có quá ít đối số.
G-Man nói 'Phục hồi Monica'

Vâng, nó gần giống như bạn đúng. Một điều nó thêm vào là nó dễ sử dụng hơn một chút (nếu cần nhiều lần). Và vâng, thông báo lỗi không tốt, tôi sẽ sửa nó.
sergeyrar

1

Bạn chỉ có thể sử dụng vihoặc nanohoặc picobiên tập viên:

# Just replace "vi" with "nano" or "pico" if you want to use them.
vi remotefile.txt

Tuy nhiên, sau đó bạn sẽ phải tự viết Some Textnó vào trình chỉnh sửa, vì vậy quá trình này không thực sự tương thích theo đợt.


-1

Tạo một kịch bản như dưới đây:

# !/bin/bash

read -p "Enter target server IP : " server
echo "Enter root password for $server : " ; read -s password

yum install sshpass -y

sshpass -p "$password" ssh -o strictHostKeyChecking=no root@$server echo "your text goes here" >> /remotefile.txt

Tôi thấy downvote - rất có thể từ một người sẽ không sử dụng lệnh mới yummà không có lý do chính đáng. Câu trả lời này cho thấy làm thế nào nhưng không phải tại sao. (Hủy bỏ downvote trong thời điểm này - Tôi hy vọng bạn sẽ chỉnh sửa phần này để cung cấp thêm ngữ cảnh)
SDsolar
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.