Wie kann ich mit dem Befehl 'cd' ein Verzeichnis eingeben, wenn es 700 Berechtigungen hat und nicht mein Eigentum ist?

86

Ich habe versucht zu verwenden sudo cd name_of_dir, erhalte jedoch die Fehlermeldung:

sudo: cd: command not found

Gibt es eine andere Möglichkeit, ein Verzeichnis eines anderen Benutzers mit 700 Berechtigungen einzugeben?

Bakhtiyor
quelle
2
Bitte fügen Sie eine ls -ldes Verzeichnisses selbst hinzu.
Rinzwind
7
Und erklären Sie bitte, warum Sie hier immer wieder negative Kommentare zu den gültigen Antworten hinterlassen. Wenn Sie der Meinung sind, dass es einen besseren Weg gibt (oder geben sollte), teilen Sie uns dies bitte mit.
Oli
1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirScheint die einzige Antwort zu sein, mit der Sie zufrieden sein werden.
Marco Ceppi
3
Die hier gegebenen Antworten sind korrekt, aber Sie stimmen sie ab und sagen, dass sie falsch sind. Entlassen Sie nicht einfach, was gesagt wird, weil Sie etwas anderes gesehen haben.
Richard Holloway
3
Das ist lustig ... er will sudo cdarbeiten, aber er stimmt Lösungen mit sudo oder su ab. Er sagt, er möchte nicht als Root arbeiten, möchte aber trotzdem direkt auf einen zugreifen, den er nicht besitzt. Klingt für mich wie ein Troll ...
MestreLion

Antworten:

110

sudo cdfunktioniert nicht, da der cdBefehl in die Shell integriert ist. Du sagst also, werde root und führe diesen Befehl aus. Sie werden root und dann der Befehl, nachdem nach sudo gesucht wurde, aber es ist kein cdBefehl zu finden.

Die zu verwendende Methode besteht darin, zu dem Benutzer zu wechseln, dem das Verzeichnis gehört. Die Erlaubnis 700ist gemeint als "der Besitzer kann lesen, schreiben und ausführen".

Wenn root das Verzeichnis besitzt sudo -i, ist password und dann cd {dir}die einzig richtige Methode. Wenn jemand anderes das Verzeichnis besitzt, können Sie weiterhin die 1. Methode verwenden, aber auch mit diesem Benutzer zu diesem Benutzer wechseln su {username}und ihn dann cdals diesen Benutzer verwenden.

Rinzwind
quelle
Nebenfrage: Wird root in der Lage sein, 700 dir einzugeben, auch wenn er nicht der Besitzer ist?
MestreLion
3
Ja, MestreLion, 700 verhindert nicht, dass root eingreift. Die Berechtigung '000' hindert den Benutzer daran, sich selbst einzugeben (ja, ein Benutzer kann ein Verzeichnis erstellen, das er selbst nicht eingeben kann ...), aber root kann dieses Verzeichnis weiterhin eingeben.
Rinzwind
1
echo ist ein Shell-Befehl. Warum kann ich "sudo echo" ausführen, aber nicht "sudo cd"?
Shoujs
Entschuldigung, die gleichen Regeln gelten für sudo echo: Sie benötigen etwas echo 'deb {text}' | sudo tee --append {file}, um Echo mit sudo zu verwenden und eine Datei zu ändern.
Rinzwind
1
Warum sind cddie Befehle, die für verfügbar sind sudo, jedoch nicht integriert?
Aaron Franke
44

sudo -i

um "root console" zu öffnen und dann

cd /path/to/directory

( cdIst ein Shell-eingebauter Befehl, daher kann er nicht das Sudo-Ziel sein.)

Vojtech Trefny
quelle
18

Um ein Root-Verzeichnis zu öffnen, können wir eine Root-Shell ausführen, zB:

sudo su
# cd /root
Takkat
quelle
3
Ich würde nicht gerne als root arbeiten. NOCH NIE!!! Und auch Experten empfehlen, sich niemals als root anzumelden. -1
Bakhtiyor
8
Das ist genau der Grund, warum Sie nicht möchten, dass die Berechtigungen die Stammverzeichnisse öffnen, nicht wahr?
Takkat
10
Es ist nichts Falsches daran, in den Root-Modus zu wechseln. Experten werden immer empfehlen, sich an root zu wenden, wenn dies erforderlich ist.
Rinzwind
2
Wenn Sie mit Dingen arbeiten, die root gehören, ist manchmal sudo suing (oder eine andere Methode) die einzig praktikable oder sogar mögliche Methode. "Experten" raten Ihnen nur, root nicht als Gewohnheit zu benutzen - es ist in Ordnung, wenn Sie es tatsächlich brauchen. Und @Vojtech, nichts ist unmöglich ...
Oli
2
@ Bakhtiyor: Es ist in der Tat nicht empfehlenswert , die ganze Zeit als root zu arbeiten. Es ist jedoch akzeptabel, es für einen einzelnen (oder einige wenige) Befehle auszugeben. Insbesondere, wenn Sie versuchen, ein Verzeichnis einzugeben, für das Ihr Benutzer keine Berechtigung hat . Sie müssen also entweder der Eigentümer oder der Root sein.
MestreLion
10

Wie andere betonten - es ist Shell eingebaut:

~ % which cd
cd: shell built-in command

Also, warum sudo Sie nicht die Shell selbst?

~ % sudo $SHELL -c "cd name_of_dir"
Daniel Bauke
quelle
5
+1 für die sudo-bash -c-Idee ... und ein Vorschlag: Vermeiden Sie die Verwendung which. Es ist lediglich ein Skript, und es werden nicht alle Möglichkeiten (binär, eingebaut, Aliase usw.) behandelt. Verwenden Sie typestattdessen. Viel sicherer, leistungsstark und portabel. Und type -pfür den Pfad einer ausführbaren Datei.
MestreLion
1
Nun, kommt darauf an ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(Mann zshbuiltins)
Daniel Bauke
1
Es kommt nicht darauf an . whenceist zsh-nur ... es funktioniert nicht in Bash, es ist nicht einmal standardmäßig in Ubuntu installiert. While typeist POSIX , was bedeutet, dass es in jeder modernen Shell funktioniert ... bash, csh, ksh .. und sogar zsh.
MestreLion
Sicher, das ist es und deshalb habe ich Ihren Kommentar gerade beim Erscheinen hochgestuft, aber ich erwähnte, dass es sich in zsh eigentlich nicht um ein Skript handelt und ähnliche Ergebnisse liefert, typeda beide Aliase für denselben Befehl sind.
Daniel Bauke
Oh jetzt verstehe ich. Nun, aber das ist in zsh. In bash, der Standard (und normalerweise nur) Terminal-Shell in Ubuntu, whichist kein eingebautes ... also wird type(oder type -p) bevorzugt.
MestreLion
4

Sie können sich auch zum Root-Benutzer erheben, indem Sie:

sudo -s

Dann können Sie in ein beliebiges Verzeichnis wechseln, in dem kein normaler Benutzer erlaubt ist:

cd /root

Oder

cd /var/lib/

Wenn Sie fertig sind, geben Sie Folgendes ein:

exit

Zum Abmelden der Root-Benutzerrechte.

Um sich als root zu erheben, können Sie die beiden Befehle auch nach &&Operator kombinieren , da dieser Operator auch die Ausführungsreihenfolge beibehält, wenn der aktuelle Befehl erfolgreich ausgeführt wird und nur dann der nächste Befehl ausgeführt werden darf:

sudo -s && cd /var/lib

Oder

sudo -s && cd /root
Vicky Dev
quelle
2

Wenn Sie wirklich arbeiten möchten , können Sie eine Shell-Funktion definieren , die eine neue Root-Shell ausführt, wenn Sie auf diese Weise ausgeführt wird . Andernfalls wird nur der reguläre Befehl ausgeführt.sudo cd directorybashsudosudo

Wie in anderen Antworten dargestellt, möchten die meisten Benutzer dies nicht tun, sondern stattdessen:

  1. Führen Sie das Programm aus sudo -s, oder sudo -iwenn Sie eine Anmeldeshell verwenden möchten (denken Sie daran, dass ein Effekt darin sudo -ibesteht, Sie im Stammverzeichnis des Stammverzeichnisses zu starten), oder sudo bashwenn Sie bashOptionen erzwingen oder an die Shell übergeben möchten .
  2. Führen Sie die neue Shell aus.cd directory
  3. Führen Sie alle (anderen) Aktionen aus, die als Root in der neuen Shell verwendet werden müssen.
  4. Führen Sie exitden Befehl aus, um die neue Shell zu verlassen. Es ist wichtig, dies nicht zu vergessen, da Sie nicht mehr Aktionen als root ausführen möchten, als Sie beabsichtigen!

Wenn Sie möchten, können Sie eine Shell-Funktion (oder ein Skript) schreiben, die die ersten beiden dieser Aktionen ausführt, wenn sie sudogefolgt werden cd, und sudoansonsten normal ausgeführt wird. Verwenden Sie dies nicht als Alternative zum Lernen, warum sudo cd dies sonst nicht gelingt . Wenn Sie nicht verstehen, was gerade passiert , werden Sie wahrscheinlich sehr verwirrt sein , wenn Sie sich in einer neuen Shell befinden (und möglicherweise verstehen Sie keine Fehlermeldungen) die auftreten).

Hier ist eine Möglichkeit, eine solche Shell-Funktion zu schreiben, die Sie auch daran erinnert, dass Sie sich in einer neuen Shell befinden und dass Sie diese beenden sollten exit, wenn Sie fertig sind. (Das Erinnerung ist wahrscheinlich für die Nutzer nützlich sein jedem Skill - Level, da man im Allgemeinen nicht gewohnt ist , in eine neue Schale zu sein , wenn man läuft sudoohne -s, -ioder den Namen eines tatsächlichen Shell als Argument.)

# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
    if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
        sudo bash -c '
                if cd -- "$2"; then # When cd fails, its own message is enough.
                    printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
                    printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
                    exec bash # Replace this bash shell with an interactive one.
                fi
            ' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
    else
        command sudo "$@"
    fi
}

Sie können dies in Ihre einfügen ~/.bashrc, obwohl dies eine merkwürdige Methode ist, sudodie Sie möglicherweise nur gelegentlich aktivieren möchten. In diesem Fall ist es besser, es in einer eigenen Datei abzulegen. Wenn Sie eine Datei erstellen, die sudo.bashin Ihrem Ausgangsverzeichnis mit diesen Inhalten aufgerufen wird , können Sie die sudoFunktion verfügbar machen, sodass sie anstelle des regulären sudoBefehls ausgeführt wird . ~/sudo.bash. Dies wirkt sich auf die aktuelle Shell und ihre untergeordneten Shells aus, jedoch nicht auf andere. Aus dem gleichen Grund, aus dem Dateien wie .bashrcnicht ausführbar sind, markieren Sie sudo.bashausführbar nicht mit chmod. Dies ist wirklich eine Bibliothek und kein eigenständiges Shell-Skript. Wenn du es getan hastFühre es als Shell-Skript aus, es würde die Funktion definieren ... aber nur in der Shell, in der das Skript ausgeführt wurde, nicht für dich als Aufrufer. (Natürlich können Sie können ein Skript für diesen schreiben, die einfach nicht sein geschehen der Ansatz , den ich hier getroffen habe.)

sudoFühren Sie Folgendes aus, um zu überprüfen, ob eine Shell-Funktion definiert ist, und um zu überprüfen, ob eine Shell-Funktion definiert ist type sudo. Führen Sie die folgende Anweisung aus, um die Funktion nach ihrer Definition zu deaktivieren (dh ihre Definition aufzuheben) unset -f sudo. Führen Sie Folgendes aus, um den regulären sudoBefehl direkt manuell auszuführen, auch wenn die Shell-Funktion definiert ist command sudo. Beachten Sie jedoch, dass Sie nicht haben , dass zu tun, denn diese sudoFunktion , dass sich tatsächlich tut , wenn es mehr oder weniger als zwei an sie übergebenen Argumente oder das erste Argument übergeben , um es alles andere als ist cd. Aus diesem Grund können Sie es weiterhin wie gewohnt verwenden sudo.

Beachten Sie auch, dass Sie mit der oben gezeigten Shell-Funktion noch andere Argumente übergeben können sudo, diese jedoch nicht cdspeziell behandeln können . Insbesondere das Ausführen wird nicht unterstützt, obwohl Sie die Shell-Funktion erweitern können, um diesen Fall zu unterstützen. Ist es auch nicht . Die Shell, die es erstellt, ähnelt dem, was Sie mit bekommen . Der Code wird nicht ausgeführt , sondern verwendet , sodass die Option ordnungsgemäß funktioniert. Es wird tatsächlich zweimal ausgeführt, wenn Sie ein Verzeichnisargument übergeben (und ansonsten nullmal). Beim Ausführen wird zuerst eine andere Bash-Shell als die, in der Sie die Funktion ausführen , entfernt und das Verzeichnis geändert. Wenn das gelingt, ersetzt essudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo diese Bash-Shell mit einer neuen, interaktiven, die Sie verwenden können.

Hier ist ein Beispiel, wie diese Shell-Funktion automatisch "das Richtige tut". Beachten Sie, dass sudo ls -A /rootsich das normal verhält. Erst wenn ich dann versuche, cdein Verzeichnis mit sudoeiner neuen Shell anzulegen, werde ich explizit daran erinnert, was los ist.

ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude      .bashrc  .config  .emacs.d  .nano     .rpmdb
.bash_history  .cache   .dbus    .local    .profile
ek@Io:~$ sudo -k  # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$

Wenn Sie versuchen, sudo cdin ein Verzeichnis zu wechseln, in das Sie nicht einmal als Root wechseln können, erhalten Sie nur eine Fehlermeldung:

ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$

sudo -kIn den obigen Beispielen habe ich zwischen zwei Aufrufen gezeigt, dass Sie als Root authentifiziert werden, bevor Sie versuchen, das Verzeichnis zu ändern. Aber du musst eigentlich nicht sudo -kselbst rennen . Da die Shell-Funktion nur ein dünner Wrapper für den eigentlichen sudoBefehl ist , funktionieren die Zwischenspeicherung Ihrer Anmeldeinformationen und anderer gängiger sudoVerhaltensweisen weiterhin normal.

Obwohl es gut funktioniert und irgendwie ordentlich ist, gebe ich zu, dass sudoes super seltsam ist , den echten Befehl mit einer gleichnamigen Funktion zu beschatten . Die meisten Benutzer werden wahrscheinlich wollen nur die Schritte ausführen sudo -s, selbst. Aber falls jemand dies will - und auch demonstrieren will, dass es möglich ist - dann ist es da.cd directory

Eliah Kagan
quelle
0

Was das Zu suoder Nicht-Diskutieren suangeht, finde ich es albern. suist gegen die Religion von Ubuntu und es ist nichts, was man nachlässig macht. Es ist erstaunlich, was rm -rf *man tun kann, wenn man root ist. Wenn Sie jedoch mit der Befehlszeilenschnittstelle (Command Line Interface, CLI) vertraut sind und Aufgaben auf Systemebene ausführen müssen, gibt es keinen Grund, diese nicht zu verwenden su. Ich habe mehrere Distributionen benutzt, von denen noch niemand erwähnt hat, dass sie benutzt werden sudo. Es ist nur eine Frage der Art der Arbeit, die Sie tun und mit welcher Methode Sie sich am wohlsten fühlen. Ich benutze beides.

Joe
quelle
1
"In den Versionen von bash und sudokubuntu habe ich mit lucid sudo cdjetzt gearbeitet - ohne irgendwelche Workarounds." Abgesehen von so etwas , von dem ich mir ziemlich sicher bin, dass es noch nie in Ubuntu war, verstehe ich nicht, wie. (Außerdem habe ich 10.04 verwendet; das hat es nicht getan.) Es ist Jahre her, seit du das gepostet hast, aber erinnerst du dich an die Details? Funktioniert das sudo cdnoch bei dir? Was ist die Ausgabe type -a sudoin einer Shell, in der es funktioniert? Möglicherweise wissen Sie es nicht - und der zweite Teil Ihrer Antwort bleibt relevant -, aber wenn Sie dies tun, können Sie es bearbeiten .
Eliah Kagan
@EliahKagan Es funktioniert definitiv nicht für mich jetzt in 16.10 und ich kann mich nicht erinnern, was ich damals getan habe. Es verstößt gegen meine Religion, bestehende Basisbefehle zu ändern, daher ist es unwahrscheinlich, dass ich das getan habe. In jedem Fall würde es, selbst wenn es funktionieren würde, jeder als schlechte Angewohnheit bezeichnen, weil es im Allgemeinen nicht funktionieren würde.
Joe