Jak zdalnie zapisać do pliku za pomocą SSH


41

Mogę bez problemu skopiować plik na zdalną maszynę z systemem Linux

scp file user@host: /pathtowrite_file

Mam jednak problemy z zapisem do pliku z jednego komputera z linuksem na inny. Oto, co próbowałem:

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

Dostaję zawiadomienie

stdin: nie jest tty

W każdym razie plik na zdalnym komputerze nie odzwierciedla tekstu wysłanego „Some Text”.

Odpowiedzi:


70

Możesz użyć polecenia „cat”, aby utworzyć plik zdalny.

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

Do -Twyłącza pseudo-terminal alokację i zatrzymuje cię od uzyskania wiadomości

Pseudo-terminal nie zostanie przydzielony, ponieważ stdin nie jest terminalem.


ale chcę zapisać do istniejącego pliku na zdalnym komputerze.
suffa

2
„cat> /remotefile.txt” działa na zdalnej maszynie, a jeśli chcesz dołączyć do istniejącego pliku, zastępujesz „>” przez „>>”
Aragorn

@suffa: Czy próbujesz dołączyć do istniejącego pliku? A może chcesz zastąpić plik, ale nie powiedzie się, jeśli jeszcze nie istnieje? Albo co?
David Schwartz

@ David Schwartz - albo. Chciałbym zastąpić i nie powieść, jeśli nie wyjdzie ... ale w tym momencie po prostu dołączę.
suffa

`echo 'Some Text' | ssh user @ remotehost" tee -a /remotefile.txt "` również działał dla mnie.
Po prostu Seth

10

Nieco krótszy niż druga odpowiedź:

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

3
Prawdziwe; to zadziała - jeśli zapisanie pojedynczego wiersza tekstu w zdalnym pliku jest naprawdę wszystkim, co OP chce zrobić. Polecenie w pytaniu wygląda jak test sprawdzający koncepcję. Pytanie brzmi: „zapis do pliku z jednego komputera z Linuksem na inny”. Jeśli użytkownik chce uruchomić dowolne polecenie (lub sekwencję poleceń) - a nie tylko echo- lokalnie, wówczas twoja odpowiedź nie pomaga, a zaakceptowana odpowiedź jest na to sposobem.
Scott,

@Scott Przy użyciu tego podejścia możliwe jest także wiele poleceń. Podobnie jak większość rzeczy Linux, TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r,

Fajny koleś, dzięki za opinię. Myślę, że to łatwiejsze niż zajęcie się moim punktem? PS Twój komentarz powyżej nie ma sensu.
g33kz0r

1
OK, chcesz więcej krytyki? (1) Dlaczego na świecie mówisz ssh localhost? To tylko zabłocenie wody, a nie zwiększenie jej czystości. (2) Nie pokazując przekierowania w zmodyfikowanym przykładzie, powstaje pytanie, czy umiesz grupować polecenia i wysyłać wszystkie dane wyjściowe do jednego pliku. … (Ciąg dalszy)
Scott,

1
(Ciąg dalszy)… (3) Nie zauważyłeś mojego punktu, koncentrując się na frazie „pojedynczy wiersz tekstu”. Chodziło mi o to, że OP może chcieć zrobić coś bardziej zaawansowanego niż pisanie znanego tekstu do pliku zdalnego - może chcieć uruchomić polecenie lokalne i wysłać dane wyjściowe do pliku zdalnego, jak w . Jeśli możesz dostosować swoją odpowiedź do tego ogólnego przypadku, zrób to. command (localhost) > file (remotehost)
Scott,

6

Można również użyć dd, aby dołączyć do pliku. Może to trochę niejasne, ale przydatne, jeśli przekierowanie wyjścia na zdalnym hoście nie jest możliwe.

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

Ten przykład dołącza twój klucz publiczny do pliku autoryzowanego_kluczy na zdalnym hoście.

(Źródło: http://www.rsync.net/resources/howto/ssh_keys.html )


3

Spowoduje to pobranie zawartości schowka na komputerze Mac i zdalne dołączenie go na końcu pliku:

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

Umożliwia to zapisywanie (dołączanie) na końcu pliku na zdalnym hoście:

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

1

Jeśli trzeba go użyć wiele razy, łatwiej będzie użyć tego kodu. Dzięki narzędziu „sshpass” ssh nie wyświetla monitu o podanie hasła przy każdym wywołaniu skryptu. (chyba że musisz zachować to w tajemnicy, lepiej nie używaj go)

Aby uzyskać więcej informacji o 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

Bardziej intuicyjny niż co? Jest to w zasadzie to samo co odpowiedź g33kz0r (sprzed prawie dwóch lat), plus kilka dzwonków i gwizdka, które nie są szczególnie jasne. Przynajmniej wyjaśnij dodane rzeczy.
Scott

Jeśli skrypt jest wywoływany z zbyt dużą liczbą argumentów, wyświetla komunikat o błędzie informujący, że argumentów jest za mało .
G-Man mówi „Przywróć Monikę”

Tak, masz prawie taką samą rację. Jedną z rzeczy, które dodaje, jest to, że jest nieco łatwiejszy w użyciu (w razie potrzeby wiele razy). I tak komunikat o błędzie nie jest dobry, naprawię go.
sergeyrar

1

Możesz po prostu użyć vilub nanolub picoedytora:

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

Będziesz jednak musiał sam napisać Some Textdo niego w edytorze, więc ten proces nie jest tak naprawdę kompatybilny wsadowo.


-1

Utwórz skrypt jak poniżej:

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

Widzę opinię negatywną - najprawdopodobniej od kogoś, kto nie użyje nowego polecenia, jak yumbez bardzo dobrego powodu. Ta odpowiedź pokazuje, ale dlaczego nie. (W tej chwili anuluję opinię negatywną - mam nadzieję, że ją wyedytujesz, aby zapewnić więcej kontekstu)
SDsolar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.