Jak działa uzupełnianie ścieżki Bash w sudo?

11

Uzupełnianie ścieżki tabulatorów nie działa (przynajmniej w Ubuntu i AFAIK Arch) z

sudo mount <whatever>

Plik ISO, który próbuję zamontować, nie istnieje /etc/fstab. Jeśli tylko piszę

mount <whatever>

zakończenie działa (ale oczywiście polecenie kończy się niepowodzeniem, ponieważ nie jestem rootem). Najwyraźniej to go sudopsuje.

Jak sprawić, by ukończenie działało z sudo?

Zaskakujące jest to

sudo umount <whatever>

prace wykończeniowe. Jak to się osiąga? Czy to wygląda /etc/fstab?

Rozwiązanie: Właśnie wstawiłem skrypt powłoki do /usr/local/bintych wywołań sudo mount ...wraz z przekazanymi argumentami. Uzupełnianie działa podczas wywoływania tego skryptu, ponieważ nie ma żadnej sudoprzeszkody.

Ali
źródło

Odpowiedzi:

11

To w ogóle nie ma nic wspólnego bash, ale zależy to od uzupełnień zaprogramowanych w pakiecie bash-completion.

Z niektórych komentarzy w pliku /etc/bash_completion.d/mount:

# mount(8) completion. This will pull a list of possible mounts out of
# /etc/{,v}fstab, unless the word being completed contains a ':', which
# would indicate the specification of an NFS server. In that case, we
# query the server for a list of all available exports and complete on
# that instead.
#

# umount(8) completion. This relies on the mount point being the third
# space-delimited field in the output of mount(8)
#

Ponadto, można znaleźć w głównym pliku /etc/bash_completionnastępujący komentarz, który wyraźnie mówić mounti umountpoleceniami:

# A meta-command completion function for commands like sudo(8), which need to
# first complete on a command, then complete according to that command's own
# completion definition - currently not quite foolproof (e.g. mount and umount
# don't work properly), but still quite useful.
#

Aktualizacja :
Komentarz na temat mounti umountpoleceń został usunięty ze bash_completion w popełnienia :

_command_offset: Restore compopts used by called command.

This fixes completions that rely on their compopts, most notably
mount(8).
Fixes bash-completion bug #313183.

Wydany wbash-completion 1.90

enzotib
źródło
4

Można to łatwo rozwiązać, przeglądając Arch Wiki :

Przydaje się funkcja autouzupełniania (dwukrotne naciśnięcie klawisza Tab na klawiaturze) po wpisaniu jakiegoś polecenia sudo.

Aby to zrobić, dodaj do ~/.bashrcpliku wiersze w tym formacie :

uzupełnij -cf twoje_komenda

Na przykład, aby włączyć automatyczne uzupełnianie po sudoi man:

complete -cf sudo
complete -cf man
Wieland
źródło
Dzięki. Pamiętaj, że automatyczne uzupełnianie działa zaskakująco dobrze w przypadku sudo umount. Jak wskazuje enzotib, ta funkcja jest zepsuta, mounta kiedy ostatni raz sprawdzałem, została również zepsuta na Arch.
Ali
Właśnie próbowałem tego na Arch i sudo mount / me <TAB> kończy się na jedynej ścieżce, którą skonfigurowałem, /etc/fstabktóra zaczyna się od / media.
Wieland
W moim przypadku, plik Próbuję zamontować jest nie w /etc/fstab. Czy możesz to sprawdzić?
Ali
0

Nie, to nie wygląda na fstab. Zakończenie bash szuka poleceń w ścieżce, aliasów w bashrc i / lub bash_profile oraz ścieżek. Więc jeśli wpiszesz coś takiego sudo mount /mnt/some_folder, powinno się ono automatycznie uzupełniać. Może kiedy to zrobiłeś umount, znajdowałeś się na względnej ścieżce do miejsca docelowego i wykonał on autouzupełnianie.

Patkos Csaba
źródło
Dzięki. Jestem pewien, że autouzupełnianie nie działa sudo mount /mnt/some_folder, 100% pewności. AFAIK też nie działa na Arch Linux. Kiedy to zrobiłem, nie umountbyłem na ścieżce względnej dla miejsca docelowego.
Ali
-1

Myślę, że bash nie chce być zbyt skomplikowany i pozostać przenośny, więc nie będą szukać w / dev, aby zaproponować zakończenie operacji montowania.

Jednak podczas wywoływania umount może łatwo sprawdzić dane wyjściowe df / mount / etc, aby dowiedzieć się, które urządzenia są zamontowane i gdzie.

Może zsh zapewni zakończenie dla montowania, do cholery zsh nawet autouzupełnianie podczas wykonywania polecenia scp ...

Aki
źródło
Plik, który próbuję zamontować, to plik ISO w moim katalogu domowym. Zakończenie nie działa. Och, zapomniałem o zakończeniu pracy z mountem, jeśli nie użyję sudo. To sudo to psuje. jakieś pomysły?
Ali
Nawet używając absolutnych ścieżek? / home / user / myiso <TAB> -> myisofile.iso. debuguj za pomocą echa sudo $ SHELL; sudo pwd, mam nadzieję, że da ci to trochę wglądu.
Aki
Tak, z absolutnymi ścieżkami. Spróbuję zaproponowanego przez ciebie debugowania. Sugerowane debugowanie przebiega /bin/bash /home/alizgodnie z oczekiwaniami.
Ali