Файл копии сценария Bash в домашний каталог пользователя (подстановочный знак)

Решение , размещенное здесь , решает проблему. Решение состоит в том, чтобы изменить размер окна терминала на виртуальной машине.

При настройке в grub2 с использованием этого решения записи как:

GRUB_TERMINAL_OUTPUT="gfxterm"
GRUB_GFXMODE=1024x768x32
GRUB_GFXPAYLOAD=keep
GRUB_GFXPAYLOAD_LINUX=keep

изменяли только разрешение меню Grub (даже при установке 1024x768x32 в PAYLOAD ]) и не решил проблему. Мне пришлось добавить vga = 0x344 в GRUB_CMDLINE_LINUX

3
07.03.2018, 19:58
4 ответа

Eso es porque la expansión de tilde ocurre antes que las expansiones variables:

The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and filename expansion.

echoing el resultado parece correcto y funciona si lo está -evaluando, pero para un script, deberá hacerlo de manera diferente. tal vez:

#...
homedir=$(getent passwd "$username" | cut -d: -f6)
cp /root/nbu/file1.sh "$homedir"
#...
6
27.01.2020, 21:07

La expansión de la tilde no funciona si se cita la parte del nombre de usuario:

$ echo ~root ~"root"
/root ~root

(y sucede antes de la expansión variable de todos modos.)

Pero dado que ya está leyendo passwden el shell, ¿por qué no hacerlo de forma completa:

#!/bin/bash
getent passwd | while IFS=: read -r user pass uid gid gecos home shell; do 
    if (( uid % 2 == 0 )); then
        echo "uid $uid of user '$user' is even and their home is '$home'";
    fi; 
done

Si su sistema tiene getent, probablemente sea mejor usarlo, en lugar de /etc/passwddirectamente.

Por otro lado, dado que realmente no parece necesitar el nombre de usuario para nada, podría hacer que su secuencia de comandos awkgenere el directorio ($6)en su lugar.

7
27.01.2020, 21:07

Pareces concentrado, así que no te daré un guion -, pero aquí hay algunos consejos:

  1. Estás usando awkincorrectamente. Prueba esto en su lugar:

    awk -F: -v uid_min=${UID_MIN:-1000} '$3%2==0 && $3>uid_min && $3!=65534{print $6}' /etc/passwd
    
  2. No hay necesidad de cat.

  3. Use su salida awkcomo entrada a su bucle read, es decir. while read USER_HOME_DIR ; do... ; done < $(awk...). Comprenda que esto significará que solo se debe generar un proceso awk, mientras que su secuencia de comandos original genera un proceso awkseparado para cada línea, por lo que esto es mucho más eficiente.

  4. Agregue una verificación en su programa awkpara limitarlo a UID por encima de 1000, o sin darse cuenta realizará su copia para muchos usuarios del sistema.

  5. Tenga en cuenta que en #1 anterior, cambié su $1a $6para extraer el directorio de inicio del usuario en lugar del nombre del usuario.

  6. Acabo de notar en mi máquina Debian que existe un usuario 'nadie' con UID 65534, por lo que es posible que deba tenerlo en cuenta. Modifiqué la declaración awken #1 en consecuencia.

  7. Según el comentario del usuario Jeff Schaller, modifiqué el programa awkpara tener en cuenta un UID mínimo personalizado. El formulario ${UID_MIN:-1000}significa establecer el valor como 1000 si, de lo contrario, sería nulo o no se establecería.

4
27.01.2020, 21:07

Creo que puedo hacerlo en una -línea. Mira esto:

eval $(awk -v source="/root/nbu/file1.sh" -v uid_min=${UID_MIN:-1000} -F: '$3%2==0 && $3>uid_min && $3!=65534{printf "cp %s %s ;", source, $6 }' /etc/passwd)

Para legibilidad:

eval $( 
  awk \
    -v source="/root/nbu/file1.sh" \
    -v uid_min=${UID_MIN:-1000} \
    -F: '
      $3%2==0 && $3>uid_min && $3!=65534 {
         printf "cp %s %s ;", source, $6 
      }
    ' /etc/passwd 
  )
1
27.01.2020, 21:07

Теги

Похожие вопросы