SSH kullanarak bir dosyaya uzaktan yazma


40

Bir dosyayı uzak bir Linux makinesine sorunsuzca kopyalayabilirim.

scp file user@host: /pathtowrite_file

Ancak bir linux makinesinden diğerine bir dosyaya yazmakta zorluk çekiyorum. İşte ne denedim:

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

Aldığım haber

stdin: tty değil

Her halükarda, uzak makinedeki dosya "Bazı Metinler" olarak gönderilen metni yansıtmıyor.

Yanıtlar:


68

Uzak dosyayı oluşturmak için "cat" komutunu kullanabilirsiniz.

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

-TMesajı alıyorum durur ve devre dışı bıraktığı uçbirimsi tahsisi,

Sahte terminal, stdin bir terminal olmadığından tahsis edilmeyecek.


ancak, uzak makinedeki varolan dosyaya yazmak istiyorum.
Suffa

2
"cat> /remotefile.txt" uzaktaki makinede çalışır ve mevcut bir dosyaya eklemek istiyorsanız, ">" ile ">>" değiştirirsiniz
Aragorn

@suffa: Mevcut bir dosyaya eklemeye mi çalışıyorsunuz? Veya dosyanın üzerine yazmak istiyor, ancak mevcut değilse başarısız olmak mı istiyorsunuz? Ya da ne?
David Schwartz

@ David Schwartz - ya. Üzerine yazmak istiyorum ve eğer çıkmazsa başarısız olmak istiyorum ... ama bu noktada sadece eklemek isterim.
12'de

`echo 'Some Text' | ssh kullanici @ remotehost" tee -a /remotefile.txt "` de benim için çalıştı.
Sadece Seth

10

Diğer cevaptan biraz daha kısa:

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

3
Doğru; bu işe yarar - uzak dosyaya tek bir satır metin yazmak gerçekten OP'nin yapmak istediği şeydir. Söz konusu komut, kavram kanıtı testi gibi görünüyor. Soru, "bir Linux makinesinden diğerine bir dosyaya yazma" diyor. Kullanıcı sadece echoyerel olarak değil, keyfi bir komut (veya komut sırası) çalıştırmak isterse , cevabınız yardımcı olmaz ve kabul edilen cevap bunu yapmanın yoludur.
Scott

@Scott Bu yaklaşımı kullanarak birden fazla komut da mümkündür. Çoğu şey gibi Linux, ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
TMTOWTDI

Harika dostum, oy için teşekkürler. Sanırım bu benim açımdan ele almaktan daha kolay? PS yukarıdaki yorumunuz anlam ifade etmiyor.
g33kz0r

1
Tamam, daha fazla eleştiri mi istiyorsun ? (1) Neden dünyada söylüyorsun ssh localhost? Bu sadece suyu çamurluyor, netleştirmiyor. (2) Değiştirilmiş örneğinizde yönlendirme göstermeyerek, komutları nasıl gruplandıracağınızı ve tüm çıktıları bir dosyaya nasıl göndereceğinizi bilip bilmediğiniz sorusunu sorarsınız. … (Devam ediyor)
Scott

1
(Devam ediyor)… (3) “Tek bir metin satırı” ifadesine odaklanarak amacımı özledin. Amacım, OP'nin uzak dosyaya bilinen metni yazmaktan daha karmaşık bir şey yapmak isteyebileceği idi - yerel bir komut çalıştırmak ve çıktıyı olduğu gibi uzak dosyaya göndermek isteyebilirdi . Cevabınızı bu genel durumu ele almak için uyarlayabilirseniz, lütfen bunu yapın. command (localhost) > file (remotehost)
Scott

6

Bir dosyaya eklemek için dd kullanmak da mümkündür . Belki biraz belirsiz fakat uzak ana bilgisayarda çıkış yeniden yönlendirme mümkün değilse kullanışlıdır.

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

Bu örnek, ortak anahtarınızı uzaktaki ana bilgisayardaki yetkili_ anahtarlar dosyasına ekler.

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


3

Bu, panonuzun içeriğini bir Mac’te alır ve bir dosyanın sonuna uzaktan ekler:

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

Bu, uzak bir ana bilgisayardaki bir dosyanın sonuna yazmanıza (eklemenize) izin verir:

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

1

Birden fazla kez kullanılması gerekiyorsa, bu kodu kullanmak daha kolay olabilir. "Sshpass" aracıyla, ssh sizden betiğin her başlatılması için bir şifre sormaz. (sırrını saklaman gerekmiyorsa, o zaman kullanmamak daha iyi olur)

Sshpass hakkında daha fazla bilgi için: 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

Hangisinden daha sezgisel? Bu aslında g33kz0r'ın cevabı ile aynıdır (neredeyse iki yıl öncesinden itibaren), ayrıca özellikle açık olmayan bazı çan ve ıslık sesi. En azından eklediğin şeyleri açıkla.
Scott

Senaryonuz çok fazla argümanla çağrılır, bu olduğunu belirten bir hata mesajı veriyor çok az argümanlar.
G-Man

Evet, haklısın hemen hemen aynı. Eklediği tek şey, kullanımının biraz daha kolay olmasıdır (gerekirse birden fazla kez). Ve evet, hata mesajı iyi değil, düzelteceğim.
sergeyrar

1

Sadece kullanabilir viveya nanoveya picoeditör:

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

Bununla birlikte, Some Texteditöre kendiniz yazmanız gerekecek , bu yüzden bu işlem gerçekten uyumlu değildir.


-1

Aşağıdaki gibi bir komut dosyası oluşturun:

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

Olumsuz oyu görüyorum - büyük olasılıkla yeni bir komutu yumçok iyi bir sebep olmadan kullanmayacak biri . Bu cevap nedenini değil nedenini gösterir. (Şu an için aşağı oylamayı iptal etme - Umarım daha fazla içerik sağlamak için bunu düzenlersiniz)
SDsolar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.