Tengo problemas para citar un nombre de archivo que finalmente se pasa a chmod
. La secuencia de comandos se escribió originalmente para StrictModes
y authorized_keys
de SSH, pero tuve que expandirla debido a un UMASK
malo que causó algunas molestias en el sistema de archivos. El guión está abajo, y su barco de producción produce:
chmod: /Users/<user>/Library/Application: No such file or directory
chmod: Support/TextMate/Managed/Bundles/HTML.tmbundle/Macros/Delete: No such file or directory
chmod: whitespace: No such file or directory
chmod: between: No such file or directory
chmod: tags.plist: No such file or directory
...
chmod: /Users/<user>/Library/Caches/com.operasoftware.Opera/Media: No such file or directory
chmod: Cache/index: No such file or directory
cut: stdin: Illegal byte sequence
...
He intentado algunas soluciones alternativas, pero ninguna de ellas me ha ayudado. Traté de hacer doble cita como ""$file""
, pero el problema persistió. También probé las garrapatas (que no se recomiendan en este caso), pero el problema persiste.
Lo más cercano a lo que realmente pude citar fue el "\"""$file""\""
disfuncional. Pero entonces chmod
se quejó de que el nombre del archivo (con comillas) no era un archivo real:
$ sudo ~/fix-perms.sh
chmod: "/Users/Shared/.localized": No such file or directory
chmod: "/Users/<user>/.CFUserTextEncoding": No such file or directory
chmod: "/Users/<user>/.lesshst": No such file or directory
¿Cómo cito el nombre de archivo que sale de find
que se pasa a chmod
? O ¿cómo obtengo chmod
para tomar el nombre del archivo como un solo argumento?
$ cat ~/fix-perms.sh
#!/bin/bash
# Directories
find /Users/* -type d -exec chmod 0700 {} \;
find /Users/Shared -type d -exec chmod 0777 {} \;
# Files
for file in 'find /Users/* -type f';
do
if [ 'file "$file" | cut -d":" -f 2 | grep -i -c executable' -eq 0 ];
then
'chmod 0600 "$file"'
else
'chmod 0700 "$file"'
fi
done
for user in 'ls -A /Users';
do
if [ -e "/Users/$user/.ssh/authorized_keys" ];
then
chmod 0600 "/Users/${user}/.ssh/authorized_keys"
fi
done