Jak używać ssh i sudo razem w bash?

10

Nie udało mi się znaleźć pytania opisującego ten konkretny scenariusz.

Próbuję wykonać bardzo podstawowy skrypt bash, aby pobrać rejestrowanie z wielu komputerów. Uruchamiam skrypt lokalnie, ale muszę uzyskać dostęp do zewnętrznego komputera za pośrednictwem ssh, a także sudo do uprzywilejowanego użytkownika na tym komputerze ...

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

Uruchomienie tego z sh -x ujawnia, że ​​bash utknął na linii 'ssh'. Próbowałem więc to zmienić:

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

To również wydaje się utknąć w nieskończoność. Czy istnieje lepsze rozwiązanie tego problemu? Nie widzę sposobu na użycie sudo su z tego, co mogę powiedzieć ...

Dzięki za wszelką pomoc!

Matt124234
źródło
Dlaczego bliskie głosowanie? To pytanie dotyczy tematu: zarządzanie sprzętem lub oprogramowaniem serwerów, stacji roboczych, pamięci masowej lub sieci, narzędzi używanych do administrowania nimi, monitorowania lub automatyzacji
jlliagre,

Odpowiedzi:

5

Sposób, w jaki to osiągam w moim obecnym środowisku, to uruchomić ssh z -tflagą, która wymusza alokację tty, a następnie uruchomić w nim root sudo -u, w następujący sposób:

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

Mam swoje konto w sudoers po drugiej stronie, więc hasło nie jest wymagane.

W tym przykładzie pokazano różne sposoby wykonania tego w ramach jednej sesji ssh, w tym uruchamianie wielu poleceń za pomocą bash lub podpowłoki. Zauważ również, że jeśli umieścisz powyższy kod w skrypcie wykonywalnym, możesz przekazać argumenty wiersza poleceń (1 $ i 2 $) do ssh, które zostaną rozwinięte, a następnie odniesione po drugiej stronie.

Michael Martinez
źródło
Niestety, ponieważ nie zarządzam zdalnym serwerem, uważam , że utknąłem tutaj, używając sudo su. Czy to nadal działałoby w tym formacie?
Matt124234,
tak, to też zadziała. po wyświetleniu monitu możesz wprowadzić hasło.
Michael Martinez
Próbowałem: ssh -t [email protected] << EOF sudo su - adcentrl egrep 'ERROR \ | WARN' / home / adcentrl / cronjobs / logs / * / * EOF Ale otrzymałem: "Pseudo -terminal nie zostanie przydzielony, ponieważ standardowe wejście nie jest terminalem. ”
Matt124234,
całkowicie w porządku. zignoruj ​​to ostrzeżenie i kontynuuj. jeśli chcesz, możesz wyłączyć opcję „RequireTty” w / etc / sudoers na zdalnym końcu
Michael Martinez,
5

Jeśli nie chcesz lub nie możesz powstrzymać sudo od pytania o hasło, jedną prostą sztuczką jest odczytanie go lokalnie i zapisanie w zmiennej lokalnej:

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF
xpmatteo
źródło
1

Jeśli sudo jest skonfigurowane tak, aby zezwalało na polecenia bez hasła, powinno to robić, co chcesz:

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

lub

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

w zależności od tego, czy chcesz file.txtutworzyć plik lokalnie czy zdalnie.

W przeciwnym razie oto sposób na przekazanie hasła użytkownika zdalnego do sudo:

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"
jlliagre
źródło
Bardzo interesujące. Jednak użycie ssh bez -t mówi mi „brak tty obecnego”. Dodanie -t usuwa ten błąd, ale nie wydaje się honorować „sudo su”, ponieważ monituje mnie o hasło. Oto, co konkretnie robię: ssh -t [email protected] "sudo su - adcentrl -c egrep" ERROR \ | WARN "/ home / adcentrl / cronjobs / logs / * / *" To daje mi: bash : WARN: nie znaleziono polecenia [sudo] hasło dla mrhyner:
Matt124234,
Niestety, najwyraźniej nie wiem, jak sformatować moje komentarze w tej sprawie
Matt124234,
Zakładałem, że sudo zostało skonfigurowane jako bez hasła dla twojego zdalnego konta.
jlliagre
i brakuje ci dodatkowych pojedynczych cytatów.
jlliagre
To spowodowało, że zrozumiałem, że bash z jakiegoś powodu nie honoruje polecenia ssh. To działa tak, jakbym próbował sudo z mojego lokalnego hosta = \
Matt124234,