Usando chown $ USER: $ USER dentro do script bash

10

Em um pequeno script bash que estou executando, estou tentando mostrar um novo diretório que é criado. Eu já adicionei:

sudo chown $USER:$USER /var/www/$sitename
sudo chmod 775 /var/www/$sitename

depois da linha onde eu mkdir ( sudo mkdir /var/www/$sitename).

Por alguma razão, o chown não está sendo executado. Eu posso executá-lo manualmente, mas quando escrito no arquivo, ele não funciona. Percebi que "chown" não é destacado na mesma cor que "mkdir" e "chmod", mas não consigo descobrir o meu problema.

Por que o chown não funciona aqui?

É um problema $USER:$USER?

EDIT Aqui está o script completo. Como eu mostraria o arquivo para qualquer usuário não raiz que executasse o script?

#!/bin/sh
#!/bin/bash
# New Site

cd /etc/apache2/sites-available/
echo "New site name (test.my):"
read sitename
echo "<VirtualHost *:80>

        ServerAdmin admin@$sitename

    ServerName $sitename

        ServerAlias $sitename

    DocumentRoot /var/www/$sitename

        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/$sitename>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined


</VirtualHost>" > $sitename.conf
sudo mkdir /var/www/$sitename
sudo chown $USER:$USER /var/www/$sitename
echo USER is $USER
sudo chmod 775 /var/www/$sitename
sudo a2ensite $sitename.conf
sudo apachectl restart
echo "New site created"
BrassApparatus
fonte
1
Existe um grupo chamado $ USER? getent group $USER
Cyrus
1
$USERvariável é definida durante o logon interativo. Como você executa seu script - da sessão de login ou usando cron ou daemon?
myaut 5/02/2015
1
Verifique se a variável USER é vista pelo script. Se você adicionar uma linha ao seu script que diz echo USER is $USER, o que é impresso?
Mark Plotnick
@MarkPlotnick Evidentemente USER is root,. Com a edição que fiz, você acha que pode explicar como exibir o arquivo para qualquer usuário não raiz que executa o script?
BrassApparatus
@myaut Eu corro manualmente a partir do terminal.
BrassApparatus

Respostas:

8

Se, por algum motivo, $USERnão estiver definido, você poderá usar o idcomando para obter a identidade do usuário real. Portanto, na primeira vez que você usa a $USERvariável, você pode usar a expansão do shell para fornecer um valor padrão. Mude a chownlinha do seu script para:

sudo chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename

Se USERestiver vazio ou não estiver definido quando isso for executado, o bash definirá a USERvariável para a saída de/usr/bin/id -run

Tim Cutts
fonte
4

Quando eu chamava o meu script, sudoele era definido $USERcomo root.

$ sudo ./myscript.sh

Eu tentei o chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenamemas ainda retornaria root.

Descobri que se eu usei whocom awkque eu era capaz de obter o usuário atual que chamou o script com sudo.

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`
Eric James Deiter
fonte
1
Para impedir a configuração currentuser(em algum momento) de usuários com várias linhas, use em seu $(who | awk 'NR==1{print $1}')lugar.
Iluminador
Eu estou tentando mudar / usr para o meu usuário: chown -R $currentuser:$currentuser /usr - não funciona - ainda mostra root: root
Sam-T
2

Para simplificar o problema e como você está obtendo a variável sitename, por que você não lê uma variável de nome de usuário?

Com isso, você deve garantir que a execução do script não depende das variáveis ​​ambientais disponibilizadas da maneira como o script é executado.

marcosjsramos
fonte
0

Acho que há apenas uma pequena falha. O sudo abre um novo shell para executar o comando e depois do sudo o usuário é root. Então, talvez você deva usar algo como isto:

MYUSER = $ USER

sudo chown $ MYUSER: $ MYUSER

como eu acho que MYUSER não é sobrescrito em sistemas específicos e deve funcionar.

Andreas Bartels
fonte
1
A variável é avaliada antes que o comando seja executado, portanto, sua alternativa sugerida não faria diferença. (Experimente-o com echo chown...e ver.)
roaima