So umgehen Sie das Passwort für den smb-Mount

Ich möchte eine SMB-Freigabe mit unterschiedlichen Benutzeranmeldeinformationen bereitstellen. Daher möchte ich verwenden

mount -o nodev,nosuid -t smbfs //user:pass=<word@host/share /mnt/share

Dieser Befehl schlägt jedoch fehl:

-bash: word@host/share: No such file or directory

Wenn ich versuche, das Passwort über eine Variable zu übergeben, bekomme ich:

$ export PWD="pass=<word"
$ mount -o nodev,nosuid -t smbfs //user:$PWD@host/share /mnt/share
mount_smbfs: URL parsing failed, please correct the URL and try again: Invalid argument

mountauf anderen Systemen scheint Benutzername und Passwort als Mount-Optionen zu akzeptieren, wie:

$ mount -o nodev,nosuid,domain=mydomain,username=user,password="pass=<word" -t smbfs //host/share /mnt/share 

oder über eine Credentials-Datei:

$ cat credentials.txt
username=user
password=pass=<word
domain=mydomain
$ mount -o nodev,nosuid,credentials=./credentials.txt -t smbfs //host/share /mnt/share 

Beide Möglichkeiten sind jedoch mit dem Mount von macOS nicht verfügbar:

mount_smbfs: -o credentials: option not supported
mount_smbfs: -o domain: option not supported
mount_smbfs: -o username: option not supported
mount_smbfs: -o password: option not supported

Die Frage ist also: Wie gebe ich das Passwort für macOS 'mount_smbfs an? Mir ist bewusst, dass das Ändern des Passworts das Problem lösen würde, aber aus Gründen ist dies keine Option.

Sie übergeben einen Umleitungsoperator in der Mitte des URI und maskieren ihn nicht und zitieren den URI nicht. Somit weisen Sie die Shell an, eine Binärdatei namens „share“ aus einem Verzeichnis namens „word@host“ mit „/mnt/share“ als Argument auszuführen und diese an einen geschlachteten Mount-Aufruf zu übergeben.
@MarcWilson Genau das ist das Problem. Daher die Frage, wie man ihm entkommt.
Können wir davon ausgehen, dass Ihre Shell bashund die Version GNU bash ist, Version 3.2.57(1)-release (x86_64-apple-darwin18)
@bmike Ja, das ist richtig, obwohl es darwin17 ist, nicht darwin18.

Antworten (3)

Etwas offtopic, aber vielleicht nützlich, wenn Sie Anmeldeinformationen mit Sonderzeichen in eine Shell-Variable einfügen möchten. In Bezug auf Ihre Bash-Befehle werde ich Sie auf mehrere Themen hinweisen:

  1. PWD ist eine immer vorhandene ENV-Variable, die das aktuelle Arbeitsverzeichnis anzeigt (Arbeitsverzeichnis drucken). Verwenden Sie diesen Namen nicht für eine PassWorD-Variable :-).
  2. Es gibt einen signifikanten Unterschied bei der Verwendung von doppelten und einfachen Anführungszeichen. Doppelte Anführungszeichen umschließen einen String, der auch erweiterbare Variablennamen enthalten kann und immer mit Escape-Problemen behaftet ist. Einfache Anführungszeichen definieren eine feste Zeichenkette und werden als solche behandelt, dh es findet keine Variablenerweiterung statt.

Beispiel:

# fix string
tatooine-2257:~ mallert$ export P='<word'
tatooine-2257:~ mallert$ echo $P
<word
# no variable expansion
tatooine-2257:~ mallert$ export P='<word $PWD'
tatooine-2257:~ mallert$ echo $P
<word $PWD
tatooine-2257:tmp mallert$ echo $PWD
/tmp
  1. Behandeln Sie schließlich Variablennamen in Erweiterung, die von gewöhnlichem Text unterscheidbar sind, wie Verweise auf ${variablename}. (Bourne Shell-Stil)
  2. Probieren Sie es aus open 'smb://username:password@server/share'- es erstellt das Volume-Mount für Sie. Wenn Sie das Passwort weglassen, wird Finder Sie danach fragen.
Option 4 ist der pragmatische Weg, um dies zum Laufen zu bringen, ohne sich auf die ausgereifte und sichere Art und Weise zu verlassen, das erforderliche Passwort in den Schlüsselbund zu schnurren und es bei Bedarf abzurufen. Das letzte Element wird viel Lernen erfordern (in der Tat das Yak rasieren), aber es wird sehr mächtig sein, sobald jemand eine Reihe von Skripten und Werkzeugen hat, die er versteht, um von bash in den Schlüsselbund zu schreiben und dann von bash daraus zu lesen.
Option 4 funktioniert jedoch nicht, da die Freigabe während des Bootens bereitgestellt werden sollte und das Kennwort dem Benutzer nicht bekannt ist. Die Aufbewahrung im Schlüsselbund wäre jedoch der bevorzugte Weg.
Trotzdem danke für die Hinweise. In der Hitze des Gefechts habe ich PWD verwendet, ohne an die allgemeine Verwendung zu denken. Auch die anderen Sachen sind ziemlich interessant. Wusste noch nichts davon.
Sie sind willkommen - helfen immer gerne. :-)

Mein Bauchgefühl ist, dass Sie die Dinge nicht komplizieren wollen, indem Sie eine Variable setzen, und Sie möchten jeder Interpunktion mit dem Zeichen \ entkommen.

Das < wird für Bash super problematisch sein

Das nächste, was Sie versuchen könnten, ist, die problematische Argumentzeichenfolge mit einfachen Anführungszeichen zu zitieren, aber ich hatte mehr Glück mit dem Backslash, der Befehlszeichen in Bash einzeln maskiert.

Wenn Sie also möchten, dass bash dies sieht:

mount -o nodev,nosuid -t smbfs //user:pass=<word@host/share /mnt/share

Sie müssen Folgendes eingeben:

mount -o nodev,nosuid -t smbfs //user:pass=\<word@host/share /mnt/share
Gibt es einen Befehl zum automatischen Escape-Strings?
@JBis Ich bin mir nicht sicher, ob ich verstehe, was Auto Escape wäre? Das <-Zeichen ist in Bash als Operator mit hoher Priorität definiert, sodass es den Befehl mount -o nodev,nosuid -t smbfs //user:pass=an eine Datei umleitet, word@host/sharedie mit etwas anderem angehängt ist. Fragen Sie, ob es einen Befehl gibt, um auf alle Zeichen hinzuweisen, die Operatoren in Bash sind?
Nun, wenn Sie ein "\" davor setzen, <sollte es als Zeichen und nicht als Operator gelesen werden.
Danke für die Antwort. Mich interessiert auch der komplizierte Weg mit Variablen, nicht nur, aber auch weil das \<nur hilft, den Bash-Fehler zu vermeiden. Jetzt ist es mount_smbfs: URL parsing failed, please correct the URL and try again: Invalid argument, was der gleiche Fehler ist wie beim Übergeben des Passworts über eine Variable.
Hallo @PVitt. Möglicherweise haben Sie mehr Glück, wenn Sie eine völlig neue Frage posten, die den einen Befehl zeigt, der den neuen Fehler enthält. \ Es kann schwierig sein, die aktuelle Frage zu bearbeiten und wiederholt neue Antworten zu erhalten oder die vorhandenen Antworten zu bearbeiten, wenn Sie die anfängliche Reihe von Fehlern mit einem Escapezeichen hinter sich gelassen haben<
@bmike: Eigentlich ist dieses Problem bereits Teil der Frage. Es ist das Ergebnis, wenn das Passwort über eine Variable übergeben wird.

Auch beim Maskieren der bash-relevanten Zeichen ( <im Beispiel) über \ oder der Übergabe des Passworts über eine Variable wie

$ export PASSWORD="pass=<word"
$ mount -o nodev,nosuid -t smbfs //user:${PASSWORD}@host/share /mnt/share

mount kann die URL nicht analysieren, da < auch ein Sonderzeichen für URLs ist:

mount_smbfs: URL parsing failed, please correct the URL and try again: Invalid argument

Also müssen wir auch das <Zeichen für URLs maskieren, das ist %3C, damit es pass=\<wordzu wird pass=%3Cword.

Weitere Informationen und eine Liste der URL-codierten Zeichen finden Sie unter Stackoverflow .