2 votos

Cómo escapar de la contraseña para el montaje smb

Quiero montar un recurso compartido SMB con diferentes credenciales de usuario. Por lo tanto quiero usar

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

Sin embargo, este comando falla:

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

Al intentar pasar la contraseña a través de una variable, obtengo:

$ 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

mount en otros sistemas parece aceptar nombre de usuario y contraseña como opciones de montaje, como:

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

o a través de un archivo de credenciales:

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

Sin embargo, ambas formas no están disponibles con el montaje de MacOS:

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

Así que la pregunta es: ¿Cómo proporcionar la contraseña a mount_smbfs de MacOS? Soy consciente de que cambiar la contraseña resolvería el problema, pero por razones esto no es una opción.

0 votos

Estás pasando un operador de redirección en medio del URI, y no lo estás escapando y no estás citando el URI. Por lo tanto, estás instruyendo al shell para que ejecute un binario llamado 'share' desde un directorio llamado 'word@host' con '/mnt/share' como argumento y pasarlo a una invocación de montaje.

0 votos

@MarcWilson Exactamente ese es el problema. De ahí la pregunta de cómo escapar de ella.

0 votos

¿Podemos asumir que su caparazón es bash y la versión es GNU bash, versión 3.2.57(1)-release (x86_64-apple-darwin18)

2voto

Garex Puntos 339

Un poco offtopic, pero tal vez útil si quieres seguir poniendo credenciales con caracteres especiales en una variable Shell. En cuanto a sus comandos bash voy a apuntar a varios temas:

  1. PWD es una variable ENV siempre presente que muestra el trabajo actual (Imprimir directorio de trabajo). Omita usar ese nombre para una variable PassWorD :-).
  2. Hay una diferencia significativa en el uso de comillas dobles y simples simples. Las comillas dobles abarcan una cadena, que también puede contener nombres de variables expandibles y siempre está sujeta a problemas de escape. Las comillas simples definen una cadena fija y se tratarán como tal, por ejemplo, no se realizará ninguna expansión de variables.

Por ejemplo:

# 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. Por último - tratar los nombres de variables en expansión distinguiéndolos del texto habitual como si se refirieran a ${variablename} . (estilo Bourne Shell)
  2. Pruebe open 'smb://username:password@server/share' - crea el volumen de montaje para usted. Si omites la contraseña, Finder te la pedirá.

0 votos

La opción 4 es la forma pragmática de conseguir que esto funcione sin depender de la forma madura y segura de ronronear la contraseña requerida en el llavero y recuperarla cuando sea necesario. Ese último punto tendrá mucho de aprendizaje (afeitando el yak de hecho), pero será muy poderoso una vez que cualquiera tenga un conjunto de scripts y herramientas que entiendan para escribir en el llavero desde bash y luego leer de él desde bash.

0 votos

Pero la opción 4 no funciona ya que el recurso compartido debe ser montado durante el arranque y la contraseña no debe ser conocida por el usuario. Sin embargo, lo mejor sería almacenarla en el llavero.

0 votos

No obstante, gracias por las pistas. En el fragor de la batalla utilicé PWD sin pensar en su uso común. También lo otro es bastante interesante. Aún no lo sabía.

0voto

Oskar Puntos 1242

Mi corazonada es que no quieres complicar las cosas estableciendo una variable y quieres escapar cada puntuación con el carácter \.

El < va a ser super problemático para bash

Lo siguiente que podrías intentar es entrecomillar la cadena de argumentos problemáticos con comillas simples, pero he tenido mejor suerte con la barra diagonal inversa escapando caracteres de comando en bash individualmente.

Así que si quieres que bash vea esto:

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

tienes que escribir esto:

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

0 votos

¿Existe un comando para autoescapar cadenas?

0 votos

@JBis No estoy seguro de entender lo que sería auto escape? El carácter < está definido como un operador de alta precedencia en bash por lo que redirige el comando mount -o nodev,nosuid -t smbfs //user:pass= a un archivo llamado word@host/share con algunas otras cosas añadidas. ¿Estás preguntando si hay un comando para señalar todos y cada uno de los caracteres que son operadores en bash?

0 votos

Bueno poner un "\" delante de < debe hacer que se lea como un carácter y no como un operador.

0voto

PaulJ Puntos 568

Incluso cuando se escapan los caracteres relevantes de bash ( < en el ejemplo) a través de \ o pasando la contraseña a través de una variable como

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

mount falla al parsear la url debido a que < también es un carácter especial para las URLs:

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

Así que también tenemos que escapar de la < para las URL, que es %3C de modo que pass=\<word se convierte en pass=%3Cword .

Véase Stackoverflow para obtener información adicional, y un lista de caracteres codificados en url .

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X