ใช้ chown $ USER: $ USER ภายในสคริปต์ทุบตี


10

ในสคริปต์ทุบตีเล็ก ๆ ที่ฉันใช้ฉันพยายามที่จะ chown ไดเรกทอรีใหม่ที่สร้างขึ้น ฉันได้เพิ่ม:

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

หลังจากบรรทัดที่ฉัน mkdir ( sudo mkdir /var/www/$sitename)

ด้วยเหตุผลบางอย่าง chown ไม่ทำงาน ฉันสามารถรันด้วยตนเอง แต่เมื่อเขียนในไฟล์มันไม่ทำงาน ฉันสังเกตว่า "chown" ไม่ได้เน้นสีเดียวกับ "mkdir" และ "chmod" แต่ฉันไม่สามารถเข้าใจปัญหาของฉันได้

ทำไม chown ไม่ทำงานที่นี่

เป็นปัญหา$USER:$USERหรือไม่?

แก้ไข นี่คือสคริปต์เต็ม ฉันจะ chown ไฟล์ใดที่ผู้ใช้ที่ไม่ใช่รูทสั่งสคริปต์

#!/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"

1
มีกลุ่มชื่อ $ USER หรือไม่ getent group $USER
Cyrus

1
$USERตัวแปรถูกตั้งค่าในระหว่างการเข้าสู่ระบบแบบโต้ตอบ คุณรันสคริปต์ของคุณอย่างไร - จากเซสชันการเข้าสู่ระบบหรือการใช้ cron หรือจาก daemon?
myaut

1
ตรวจสอบว่าตัวแปร USER ถูกเห็นแม้โดยสคริปต์ หากคุณเพิ่มบรรทัดลงในสคริปต์ของคุณที่ระบุecho USER is $USERว่าจะพิมพ์ออกมาเป็นอย่างไร
Mark Plotnick

@MarkPlotnick USER is rootเห็นได้ชัดว่า ด้วยการแก้ไขที่ฉันทำคุณคิดว่าคุณสามารถอธิบายวิธีการ chown ไฟล์ที่ผู้ใช้ที่ไม่ใช่รูทรันสคริปต์หรือไม่?
BrassApp เครื่องมือ

@ myaut ฉันรันมันเองจาก terminal
BrassApp เครื่องมือ

คำตอบ:


9

หาก$USERไม่ได้ตั้งค่าด้วยเหตุผลบางอย่างคุณสามารถใช้idคำสั่งเพื่อรับข้อมูลประจำตัวของผู้ใช้จริง ดังนั้นครั้งแรกที่คุณใช้$USERตัวแปรคุณสามารถใช้การขยายเชลล์เพื่อระบุค่าเริ่มต้น เปลี่ยนchownบรรทัดในสคริปต์ของคุณเป็น:

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

หากUSERไม่มีข้อมูลหรือไม่ได้ตั้งค่าไว้เมื่อเรียกใช้งาน bash จะตั้งค่าUSERตัวแปรเป็นผลลัพธ์ของ/usr/bin/id -run


4

เมื่อฉันเรียกสคริปต์ของฉันsudoมันจะตั้งค่า$USERเป็นรูท

$ sudo ./myscript.sh

ฉันพยายามchown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenameแต่มันจะกลับมารูท

ฉันพบว่าฉันใช้whoกับawkฉันก็สามารถรับผู้ใช้ปัจจุบันที่เรียกว่าสคริปต์ด้วยsudoได้

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`

1
เพื่อป้องกันการตั้งค่าcurrentuser(บางครั้ง) กับผู้ใช้หลายคนให้ใช้$(who | awk 'NR==1{print $1}')แทน
ความกระจ่าง

ฉันพยายามที่จะเปลี่ยน / usr ให้กับผู้ใช้ของฉัน: chown -R $currentuser:$currentuser /usr - ไม่ทำงาน - ยังคงแสดงให้เห็นถึงราก: ราก
Sam-T

2

เพื่อลดความซับซ้อนของปัญหาและเนื่องจากคุณได้รับชื่อชื่อตัวแปรทำไมคุณไม่อ่านตัวแปรชื่อผู้ใช้?

เมื่อคุณตรวจสอบให้แน่ใจว่าการเรียกใช้สคริปต์ไม่ได้ขึ้นอยู่กับตัวแปรสภาพแวดล้อมที่มีให้วิธีการเรียกใช้งานสคริปต์


0

มีความผิดเล็กน้อยที่ฉันคิด sudo เปิดเชลล์ใหม่สำหรับการดำเนินการคำสั่งและหลังจาก sudo ผู้ใช้เป็นรูต ดังนั้นบางทีคุณควรใช้สิ่งนี้:

MYUSER = $ USER

sudo chown $ MYUSER: $ MYUSER

อย่างที่ฉันคิดว่า MYUSER ไม่ได้ถูกเขียนทับระบบและจะทำงานได้


1
ตัวแปรจะถูกประเมินก่อนที่คำสั่งจะถูกดำเนินการดังนั้นทางเลือกที่คุณแนะนำจะไม่สร้างความแตกต่าง (ลองด้วยecho chown...และดู)
roaima
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.