Czy wykonać polecenie na komputerze lokalnym z podłączonego zdalnego hosta SSH?

13

Powiedzmy, że podłączyłem się do zdalnego komputera za pośrednictwem SSH. Z programu na tym komputerze zdalnym muszę wykonać polecenie na moim komputerze lokalnym (inicjatorze połączenia).

Co nasuwa pytanie: czy możliwe jest przejście do istniejącego połączenia między dwoma komputerami w celu uruchomienia polecenia na komputerze lokalnym?

Rozważałem uruchomienie polecenia ssh user@host-of-connecting-party <command>na komputerze zdalnym, aby nawiązać odwrócone połączenie. Jest to jednak trudniejsze do zautomatyzowania i wymaga interwencji użytkownika. Miałem nadzieję, że uda mi się to w pełni zautomatyzować lub przynajmniej wykryć nazwę użytkownika / hosta podłączonego użytkownika.

Aeyoun
źródło
Jasne jest, co chcesz zrobić. To, co nie jest dla mnie jasne, to część, w której powiedziałeś: „Miałem nadzieję, że mogę to w pełni zautomatyzować lub przynajmniej wykryć nazwę użytkownika / hosta podłączonego użytkownika”. Co masz na myśli?
hytromo
„trudniejsze do zautomatyzowania i wymagać interwencji użytkownika” jest w tym przypadku równoznaczne z „bezpiecznym”. Jeśli zdalny host byłby w stanie uruchamiać polecenia na klientach, które się z nim łączą, byłoby to bardzo niepewne ... wyobraź sobie, że serwer został przejęty, a każdy, kto się z nim łączy, zaraziłby swój komputer lokalny ... byłoby fajnie :)
Siergiej

Odpowiedzi:

5

Czasami mam podobną potrzebę, o ile łączę się przez Putty z naszym serwerem VPN, a stamtąd przez ssh do innego hosta, który nie jest dla mnie dostępny bezpośrednio z powodu konfiguracji VPN.

Czasami muszę po prostu szybko sprawdzić coś na maszynie serwera VPN, jednocześnie mając uruchomioną moją „sesję ssh”. Jednym z podejść jest uruchomienie sesji ssh screen, która, jak zauważyłem, dodaje pewne opóźnienie w porównaniu z „zwykłym ssh”. Innym podejściem, którym chciałbym się tutaj podzielić, jest:

Podczas sesji SSH naciśnij Enter, następnie ~, (upewnij się, że nie jest wyświetlany, tzn. Jesteś w trybie poleceń), a następnie Ctrl- Z. Spowoduje to umieszczenie procesu klienta ssh na „hoście” w tle, a otrzymasz coś w rodzaju:

[root@client170 ~]# ~^Z [suspend ssh]

[1]+  Stopped                 ssh [email protected]
[root@vps291736 ~]#

Teraz jesteś na „hoście”, możesz robić, co chcesz (chociaż nie jestem pewien, jak długo utrzyma się sesja ssh), a następnie powrócić do sesji SSH, uruchamiając fg.

Przynajmniej działa to dla mnie, gdy jestem podłączony ze stacji roboczej Win10 za pośrednictwem Putty na maszynie Wirtualnej opartej na CentOS, a ta maszyna wirtualna łączy się przez SSH z innym hostem.

Mam nadzieję, że to komuś pomaga!

62mkv
źródło
2
Jeśli masz PermitLocalCommand yesw twojej .ssh/configdla gospodarza, można również zrobić <Enter>~C, wtedy !<command>.
mur
5

@ 62mkv odpowiedź jest znacznie lepszym rozwiązaniem. Użyć tego.

Dla kompletności i ciekawości, jeśli masz serwer ssh uruchomiony na komputerze lokalnym, możesz utworzyć tunel ssh, aby umożliwić połączenia ssh ze zdalnego hosta na porcie 20202 z powrotem do lokalnego na porcie 22. Przykład polecenia:

ssh -R20202:localhost:22 [email protected]

To uruchomi połączenie ssh, ale także skonfiguruje tunel z powrotem do serwera ssh działającego na twoim komputerze. Następnie możesz to zrobić, gdy ssh'ed na zdalnym hoście:

ssh -p 20202 localuser@localhost

Oczywiście może to szybko stać się mylące - szczególnie jeśli technika jest zagnieżdżona więcej niż raz. Dodaje to również trochę opóźnienia - ponieważ wszystko, co wykonujesz na komputerze lokalnym, jest odbijane przez zdalny host.

Dodatkowe informacje na temat tunelowania ssh dla tych, których ciekawość nie została jeszcze zaspokojona, można znaleźć w odpowiedzi na to pytanie dotyczące wymiany stosów unixów .

starbeamrainbowlabs
źródło
To doskonała odpowiedź. Dokładnie to, czego potrzebowałem, aby móc wykonać ssh na zdalnej maszynie, która była za zaporą ogniową i która była dostępna tylko przez teamniewer. Po prostu połączyłem się przez Teamviewer, a następnie z sesji teamviewer z powrotem do mojej maszyny, tworząc tunel ssh, a następnie mogłem otworzyć tyle sesji ssh z mojego komputera na zdalną, ile potrzebowałem.
Marian
Rzeczywiście, jest to o wiele lepszy przypadek zastosowania dla tunelu takiego jak ten @Marian. Robię to sam.
starbeamrainbowlabs,
0

Jeśli zarówno komputer lokalny, jak i zdalny są dostępne z Internetu, możesz po prostu otworzyć sesję SSH z komputera lokalnego na komputerze zdalnym, a następnie w tej sesji otworzyć kolejną sesję ssh z komputera zdalnego na komputerze lokalnym:

localuser@local> ssh remoteuser@remote
Password:
remoteuser@remote> hostname
remote
remoteuser@remote> ssh localuser@local
Password:
localuser@local> hostname
local
localuser@local> exit
remoteuser@remote> exit
localuser@local>

Aby zautomatyzować rzeczy, zobacz Fabric (wymagana znajomość języka Python)

from fabric.api import *

@hosts('host1')
def clean_and_upload():
    local('find assets/ -name "*.DS_Store" -exec rm '{}' \;')
    local('tar czf /tmp/assets.tgz assets/')
    put('/tmp/assets.tgz', '/tmp/assets.tgz')
    with cd('/var/www/myapp/'):
        run('tar xzf /tmp/assets.tgz')
Siergiej
źródło
0

Możesz użyć sshpass, aby połączyć się ze zdalnym komputerem i uruchomić polecenia.

./sshpass -p "password" ssh user@remoteIP 'bash -s < EOI "Your Commands go here" EOI'

Użyj prostego skryptu powłoki na komputerze lokalnym i użyj powyższego kodu, gdy chcesz uruchamiać polecenia na komputerze zdalnym. Jest to jeden ze sposobów, w jaki ogólnie stosuję się w automatyce.

Priyanka
źródło
0

Nie, nie możesz włamać się do istniejącej sesji.

Twoja aplikacja będzie potrzebowała sposobu ponownego połączenia z klientem. SSH będzie działać, jeśli klient ma uruchomiony serwer SSH, a serwer może osiągnąć port 22 na kliencie. Automatyzacja nie byłaby trudna, gdybyś używał uwierzytelniania opartego na kluczach zamiast uwierzytelniania hasłem - w ten sposób interwencja użytkownika nie byłaby konieczna.

Informacje na temat konfigurowania uwierzytelniania opartego na kluczach można znaleźć tutaj: http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/

Omegamormegil
źródło
0

Jeśli masz dostęp do innego terminala, możesz wysłać SIGSTOP za pomocą polecenia „kill -19 PID” do komendy ssh, która zainicjowała połączenie. Następnie przejmiesz kontrolę nad terminalem na terminalu na komputerze klienta. Po zakończeniu możesz przywrócić połączenie ssh, po prostu wpisując fg, aby obudzić klienta ssh.

Ale oczywiście pytanie brzmi: jeśli masz już terminal na komputerze klienta, dlaczego miałbyś to zrobić :)

Hedi
źródło