Bagaimana menulis dari jarak jauh ke file menggunakan SSH


41

Saya dapat menyalin file ke mesin Linux jarak jauh tanpa masalah

scp file user@host: /pathtowrite_file

Namun, saya mengalami kesulitan menulis ke file dari satu mesin linux ke yang lain. Inilah yang saya coba:

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

Pemberitahuan yang saya dapatkan adalah

stdin: bukan tty

Bagaimanapun, file pada mesin jarak jauh tidak mencerminkan teks yang dikirim 'Beberapa Teks'.

Jawaban:


70

Anda dapat menggunakan perintah "cat" untuk membuat file jarak jauh.

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

The -Tmenonaktifkan semu-terminal alokasi dan menghentikan Anda dari mendapatkan pesan,

Pseudo-terminal tidak akan dialokasikan karena stdin bukan terminal.


tapi, saya ingin menulis ke file yang ada di mesin remote.
suffa

2
"cat> /remotefile.txt" berjalan di mesin jarak jauh dan jika Anda ingin menambahkan file yang sudah ada, Anda mengganti ">" dengan ">>"
Aragorn

@suffa: Apakah Anda mencoba menambahkan file yang ada? Atau Anda ingin menimpa file tetapi gagal jika belum ada? Atau apa?
David Schwartz

@ David Schwartz - baik. Saya ingin menimpa, dan gagal jika tidak keluar ... tapi, saya akan menambahkan hanya pada saat ini.
suffa

`echo 'Some Text' | ssh user @ remotehost" tee -a /remotefile.txt "` bekerja untuk saya juga.
Cukup Seth

10

Sedikit lebih pendek dari jawaban yang lain:

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

3
Benar; ini akan berhasil - jika menulis satu baris teks ke file jarak jauh benar-benar semua OP ingin lakukan. Perintah dalam pertanyaan tersebut terlihat seperti tes pembuktian konsep. Pertanyaannya mengatakan, "menulis ke file dari satu mesin Linux ke yang lain." Jika pengguna ingin menjalankan perintah sewenang-wenang (atau urutan perintah) - dan bukan hanya echo- secara lokal, maka jawaban Anda tidak membantu, dan jawaban yang diterima adalah cara untuk melakukannya.
Scott

@Scott Beberapa perintah juga dimungkinkan menggunakan pendekatan ini. Seperti kebanyakan hal Linux, TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r

Bung keren, terima kasih untuk downvote. Saya kira itu lebih mudah daripada benar-benar menangani poin saya? PS komentar Anda di atas tidak masuk akal.
g33kz0r

1
OK, Anda ingin lebih banyak kritik? (1) Mengapa Anda mengatakannya ssh localhost? Itu hanya memperkeruh air, tidak membuatnya lebih jernih. (2) Dengan tidak menunjukkan pengalihan dalam contoh yang dimodifikasi, Anda mengajukan pertanyaan apakah Anda tahu cara mengelompokkan perintah dan mengirim semua output ke satu file. … (Lanjutan)
Scott

1
(Lanjutkan) ... (3) Anda melewatkan poin saya, dengan memfokuskan pada frasa “satu baris teks”. Maksud saya adalah OP mungkin ingin melakukan sesuatu yang lebih canggih yang menulis teks yang dikenal ke file jarak jauh - dia mungkin ingin menjalankan perintah lokal dan mengirim output ke file jarak jauh, seperti pada . Jika Anda dapat menyesuaikan jawaban Anda untuk mengatasi kasus umum itu, silakan lakukan. command (localhost) > file (remotehost)
Scott

6

Dimungkinkan juga untuk menggunakan dd untuk menambahkan file. Mungkin agak tidak jelas tetapi berguna jika redirection output pada host jarak jauh tidak mungkin.

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

Contoh ini menambahkan kunci publik Anda ke file otor_keys pada host jarak jauh.

(Sumber: http://www.rsync.net/resources/howto/ssh_keys.html )


3

Ini akan mengambil konten clipboard Anda di Mac dan menambahkannya ke akhir file dari jarak jauh:

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

Ini memungkinkan Anda untuk menulis (menambahkan) ke akhir file di host jarak jauh:

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

1

Jika harus digunakan beberapa kali mungkin lebih mudah menggunakan kode ini. Dengan alat "sshpass", ssh tidak akan meminta Anda untuk kata sandi untuk setiap permintaan skrip. (Kecuali jika Anda perlu merahasiakannya, lebih baik tidak menggunakannya)

Untuk info lebih lanjut tentang 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

Lebih intuitif dari apa? Ini pada dasarnya sama dengan jawaban g33kz0r (dari hampir dua tahun yang lalu), ditambah beberapa bel dan peluit yang tidak terlalu jelas. Setidaknya jelaskan hal-hal yang telah Anda tambahkan.
Scott

Jika skrip Anda dipanggil dengan terlalu banyak argumen, ia mengeluarkan pesan kesalahan yang mengatakan bahwa terlalu sedikit argumen.
G-Man Mengatakan 'Reinstate Monica'

Ya itu hampir sama Anda benar. Satu hal yang ditambahkan adalah sedikit lebih mudah digunakan (jika diperlukan beberapa kali). Dan ya pesan kesalahannya tidak bagus, saya akan memperbaikinya.
sergeyrar

1

Anda cukup menggunakan viatau nanoatau picoeditor:

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

Namun, Anda kemudian harus menulis Some Textsendiri di editor, sehingga proses ini tidak benar-benar kompatibel dengan batch.


-1

Buat skrip seperti di bawah ini:

# !/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

Saya melihat downvote - kemungkinan besar dari seseorang yang tidak akan menggunakan perintah baru seperti yumtanpa alasan yang sangat bagus. Jawaban ini menunjukkan bagaimana tetapi tidak mengapa. (Membatalkan downvote untuk saat ini - Saya harap Anda akan mengedit ini untuk memberikan lebih banyak konteks)
SDsolar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.