Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Hej, stworzyłem sobie taki prosty skrypcik do łączenia się z urządzeniami przez SSH:
#!/bin/bash file=/usr/local/bin/mtcmd.lists/mt.list if [[ -z $1 ]]; then read -p "Wprowadź komendę: " cmd else cmd=$1 fi while IFS= read -r line; do ip=`echo $line | cut -f1 -d " "` name=`echo $line | cut -f2 -d " " | tr -d "#"` printf "[$name] " ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@$ip "$cmd" 2> /dev/null done < $file
W pliku /usr/local/bin/mtcmd.lists/mt.list mam IPki w takiej strukturze:
192.168.111.32 #ROUTER1 192.168.111.29 #ROUTER2 192.168.15.1 #ROUTER3 192.168.107.1 #ROUTER4 10.10.0.2 #ROUTER5
Dlaczego po pierwszym połączeniu ssh wychodzi mi z całej pętli? Kiedyś miałem tylko same IPki w pliku mt.list a pętla wyglądała tak:
for ip in $(cat /usr/local/bin/mtcmd.lists/mt.list) do printf "[$ip] " ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null admin@$ip "$cmd" 2> /dev/null done
i wszystko pięknie banglało. Co ciekawe, gdy w pliku umieszczę dwa IP routerów, z którymi nie da się połączyć przez SSH a dopiero z trzecim uda się nawiązać połączenie to w odpowiedzi dostaję:
root@serwer:[/usr/local/bin]: mtcmd "/system routerboard print" [ROUTER1] [ROUTER2] [ROUTER3] routerboard: yes model: CCR1036-12G-4S serial-number: xxxxx firmware-type: tilegx factory-firmware: 3.09 current-firmware: 6.43.4 upgrade-firmware: 6.46.4 root@serwer:
i po udanym połączeniu SSH wraca do konsoli
Offline
dodaj parametr -n do komendy ssh
Offline
Temat powrócił. Łączę się w petli z innymi routerami, które (nie wiedzieć czemu) po dodaniu opcji -n odmawiają połączenia (Komunikat Only cli connections are allowed to the AP) a bez -n jak wiadomo, wychodzi z pętli.
Czy jest jakiś inny sposób na rozwiązanie tego zagadnienia?
Offline
Spróbuj najpierw odpalić w terminalu prostą komendę, np. :
ssh user@iproutera ls
i zobacz czy zadziała bez zająknięcia. Coś mi się wydaje, że host woła o jakieś hasło, czyli nie ma skonfigurowanego logowania na samych kluczach. Co to za router i jaki jest na nim system?
A opcja -n działa jak pisze w manualu:
-n Redirects stdin from /dev/null (actually, prevents reading from
stdin). This must be used when ssh is run in the background. A
common trick is to use this to run X11 programs on a remote ma‐
chine. For example, ssh -n shadows.cs.hut.fi emacs & will start
an emacs on shadows.cs.hut.fi, and the X11 connection will be au‐
tomatically forwarded over an encrypted channel. The ssh program
will be put in the background. (This does not work if ssh needs
to ask for a password or passphrase; see also the -f option.)
Czyli po prostu tak jak komenda:
ssh host </dev/null
Ostatnio edytowany przez seler (2020-12-23 22:11:32)
Offline
Jest to SCALANCE W1750D.
ssh user@iproutera komenda
działa bez zająknięcia. Nie loguje się na samych kluczach, używam sshpass. Zarówno sshpass -n jak i ssh -n działa tak samo (Only cli connections are allowed to the AP)
Offline
Tu masz alternatywne rozwiązanie z ssh bez parametru -n, z użyciem niestandardowych deskryptorów:
Solution
At least in bash, you can have read use a different file descriptor.Kod:
while read -u10 HOST ; do ssh $HOST "uname -a" ; done 10< servers.txt # ^^^^ ^^ought to work. 10 is just an arbitrary file number I picked. 0, 1, and 2 have defined meanings, and typically opening files will start from the first available number (so 3 is next to be used). 10 is thus high enough to stay out of the way, but low enough to be under the limit in some shells. Plus its a nice round number...
https://unix.stackexchange.com/questions/107800/usi … 107801#107801
Ostatnio edytowany przez seler (2020-12-24 20:29:00)
Offline
Super, do pełni szczęścia potrzebowałbym jeszcz jak sprawdzic, czy wszystkie elementy tablicy w bashu mają wartośc true i skrypt będzie śmigał jak tralala.
Offline
No więc trzeba oczywiście przeiterować wszystkie elementy tablicy i sprawdzić każdy z nich, np.
( for element in "${tablica[@]}"; do if [[ "$element" != true ]]; then exit 1 fi done ) [[ $? -eq 0 ]] && echo "wszystko ok"
Offline