Menggunakan chown $ USER: $ USER di dalam skrip bash

10

Dalam skrip bash kecil yang saya jalankan, saya mencoba mencari direktori baru yang dibuat. Aku sudah menambahkan:

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

setelah baris di mana saya mkdir ( sudo mkdir /var/www/$sitename).

Karena suatu alasan chown tidak mengeksekusi. Saya dapat menjalankannya secara manual tetapi ketika ditulis dalam file itu tidak berfungsi. Saya telah memperhatikan bahwa "chown" tidak disorot dalam warna yang sama dengan "mkdir" dan "chmod" tetapi saya tidak dapat memecahkan masalah saya.

Mengapa chown tidak berfungsi di sini?

Apakah ini masalah $USER:$USER?

EDIT Berikut adalah skrip lengkapnya. Bagaimana cara saya meng-chown file ke pengguna non root mana saja yang menjalankan 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"
Alat Kuningan
sumber
1
Apakah ada grup bernama $ USER? getent group $USER
Cyrus
1
$USERvariabel diatur selama login interaktif. Bagaimana Anda menjalankan skrip Anda - dari sesi login atau menggunakan cron atau dari daemon?
myaut
1
Periksa apakah variabel USER bahkan dilihat oleh skrip. Jika Anda menambahkan baris ke skrip yang bertuliskan echo USER is $USER, apa yang tercetak?
Mark Plotnick
@MarkPlotnick Jelas USER is root,. Dengan hasil edit yang saya buat, apakah Anda pikir Anda bisa menjelaskan cara meng-chown file ke pengguna non-root mana yang menjalankan skrip?
BrassApparatus
@myaut saya menjalankannya secara manual dari terminal.
BrassApparatus

Jawaban:

8

Jika, karena alasan tertentu, $USERtidak disetel, Anda dapat menggunakan idperintah untuk mendapatkan identitas pengguna sebenarnya. Jadi saat pertama kali Anda menggunakan $USERvariabel, Anda dapat menggunakan ekspansi shell untuk memberikan nilai default. Ubah chownbaris dalam skrip Anda menjadi:

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

Jika USERkosong atau tidak disetel saat ini dijalankan, bash akan mengatur USERvariabel ke output dari/usr/bin/id -run

Tim Cutts
sumber
4

Ketika saya memanggil skrip saya dengan sudoitu akan diatur $USERke root.

$ sudo ./myscript.sh

Saya mencoba chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenametetapi masih akan kembali root.

Saya menemukan jika saya menggunakan whodengan awksaya bisa mendapatkan pengguna saat ini yang disebut skrip dengan sudo.

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`
Eric James Deiter
sumber
1
Untuk mencegah pengaturan currentuser(kadang-kadang) dengan pengguna multiline, gunakan $(who | awk 'NR==1{print $1}')saja.
Illuminator
Saya mencoba untuk mengubah / usr ke pengguna saya: chown -R $currentuser:$currentuser /usr - tidak bekerja - masih menunjukkan root: root
Sam-T
2

Untuk menyederhanakan masalah dan karena Anda mendapatkan nama variabel, mengapa Anda tidak membaca variabel nama pengguna?

Dengan itu Anda akan memastikan bahwa eksekusi skrip tidak tergantung pada variabel lingkungan yang disediakan saat skrip dieksekusi.

marcosjsramos
sumber
0

Hanya ada kesalahan kecil yang saya pikir. sudo membuka shell baru untuk mengeksekusi perintah dan setelah sudo pengguna root. Jadi mungkin Anda harus menggunakan sesuatu seperti ini:

MYUSER = $ USER

sudo chown $ MYUSER: $ MYUSER

karena saya pikir MYUSER bukan systemspezific ditimpa dan akan berfungsi.

Andreas Bartels
sumber
1
Variabel dievaluasi sebelum perintah dieksekusi, jadi alternatif yang Anda sarankan tidak ada bedanya. (Cobalah echo chown...dan lihat.)
roaima