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

14

Próbuję skonfigurować automatyczne przeskakiwanie SSH przez serwer, który nie ma nc.

Działa to z wiersza poleceń:

ssh -A gateway ssh steve@target

(Dodałem mój klucz publiczny do agenta SSH).

Jednak dodanie go do ~ / .ssh / config nie powoduje:

Host target
  User steveb
  ProxyCommand ssh -A gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

Próba wymuszenia tego problemu -tjest zabawna, ale bezużyteczna.

ProxyCommand ssh -A -t gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

Więcej -t? Nie dobrze.

ProxyCommand ssh -A -t -t gateway ssh steve@targetip

$ ssh target
tcgetattr: Inappropriate ioctl for device


^CKilled by signal 2.

czy to możliwe? Większość samouczków (np. Http://www.arrfab.net/blog/?p=246 ) sugeruje użycie nc.

Steve Bennett
źródło
Czy wniosek, że Netcat jest wymagany?
MountainX
Wygląda jak to. W tym przypadku udało mi się go zainstalować, rozwiązując mój problem - ale nie zawsze mam ten luksus.
Steve Bennett,
Zobacz moją odpowiedź poniżej na dwa sposoby, w jaki mogłem to zrobić bez netcata.
MountainX

Odpowiedzi:

13

SSH ProxyCommand bez netcat

ProxyCommand jest bardzo przydatny, gdy hosty są dostępne tylko pośrednio. W przypadku netcat jest to względna strata do przodu:

ProxyCommand ssh {gw} netcat -w 1 {host} 22

Tutaj {gw} i {host} są symbolami zastępczymi dla bramy i hosta.

Ale jest to również możliwe, gdy netcat nie jest zainstalowany na bramie:

ProxyCommand ssh {gw} 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'

/ Dev / tcp jest wbudowaną funkcją standardowego basha. Pliki nie istnieją. Aby sprawdzić, czy bash ma wbudowaną tę funkcję, uruchom:

cat < /dev/tcp/google.com/80 

... w bramie.

Aby upewnić się, że używasz bash, użyj:

ProxyCommand ssh {gw} "/bin/bash -c 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'"

Działa nawet z ControlMaster.

(Zaktualizowano 22 października, aby uwzględnić zabijanie, aby wyczyścić kota w tle) (Zaktualizowano 3 marca 2011 roku, aby wyjaśnić symbole zastępcze i wyjaśnić / dev / tcp)

100% uznania dla Rolanda Schulza. Oto źródło:
http://www.rschulz.eu/2008/09/ssh-proxycommand-without-netcat.html
zobacz więcej przydatnych informacji w komentarzach.

Jest też więcej tutaj:
http://www.linuxjournal.com/content/tech-tip-tcpip-access-using-bash
http://securityreliks.securegossip.com/2010/08/enabling-devtcp-on-backtrack -4r1ubuntu /

AKTUALIZACJA : oto coś nowego od Marco

W odniesieniu do ProxyCommand w ~ / .ssh / config, w którym ma się taką linię:

ProxyCommand ssh gateway nc localhost %p

Marco mówi:

Nie potrzebujesz netcata, jeśli używasz najnowszej wersji OpenSSH. Możesz zamienić nc localhost% p na -W localhost:% p.

Wynik wyglądałby tak:

ProxyCommand ssh gateway -W localhost:%p
MountainX
źródło
8

Duży T, a nie mały T.

-T' Disable pseudo-tty allocation.
-t' Force pseudo-tty allocation. 

Mój skrypt zwrócił tę wiadomość i już jej nie ma.

/usr/bin/ssh -T -q -i $HOME/.ssh/one_command other_system

Korzystam z authorized_keysystemu other_system, aby uruchomić polecenie:

from="my.mydomain.com",command="bin/remotely-run" ssh-rsa ... 
użytkownik46083
źródło
3

Wypróbuj to:

ProxyCommand ssh -A -t gateway ssh -t steve@targetip
Hauke ​​Laging
źródło
Zaraz, czym to się różni od tego, czego próbowałem?
Steve Bennett
@ SteveBennett Różnica polega na tym, że nie tylko próbuje ona przydzielić TTY na drugim systemie, ale także na pierwszym.
Hauke ​​Laging
to dokładnie to samo polecenie, o którym wspomniałem z „zabawnym, ale nieprzydatnym” rezultatem?
Steve Bennett,
@ SteveBennett Naprawdę źle to odczytałem. Moim celem było -tpołączenie obu połączeń i widziałem to w niewłaściwym. Zredagowałem swoją odpowiedź.
Hauke ​​Laging
Ach Cóż, nadal nie dobrze. Wypróbowałem wszystkie kombinacje.
Steve Bennett
-3

Możesz wypróbować następującą technikę ssh'ing na serwerze 1, a następnie ssh'ing na serwerze 2.

$ ssh -t user1@server1 ssh -t user2@server2 

Robienie tego w ten sposób działa dla mnie.

Jan Marius Evang
źródło
1
Wyjaśnij więcej ... Co robi to polecenie i jak przydatne jest rozwiązanie odpowiedzi.
Tejas,