Sử dụng chown $ USER: $ USER bên trong tập lệnh bash


10

Trong một tập lệnh bash nhỏ tôi đang chạy, tôi đang cố gắng tạo ra một thư mục mới được tạo. Tôi đã thêm:

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

sau dòng nơi tôi mkdir ( sudo mkdir /var/www/$sitename).

Vì một số lý do, chown không được thực thi. Tôi có thể thực hiện thủ công nhưng khi được ghi trong tệp thì nó không hoạt động. Tôi đã nhận thấy rằng "chown" không được tô sáng cùng màu với "mkdir" và "chmod" nhưng tôi không thể tìm ra vấn đề của mình.

Tại sao không làm việc ở đây?

Nó có phải là một vấn đề với $USER:$USER?

EDIT Đây là kịch bản đầy đủ. Làm thế nào tôi có thể chỉnh sửa tập tin cho bất kỳ người dùng không phải root nào thực thi tập lệnh?

#!/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
Có một nhóm có tên $ USER? getent group $USER
Cyrus

1
$USERbiến được đặt trong quá trình đăng nhập tương tác. Làm thế nào để bạn chạy tập lệnh của bạn - từ phiên đăng nhập hoặc sử dụng cron hoặc từ daemon?
myaut 5/2/2015

1
Kiểm tra xem biến USER thậm chí có được nhìn thấy bởi tập lệnh không. Nếu bạn thêm một dòng vào tập lệnh của bạn mà nói echo USER is $USER, nó in ra cái gì?
Đánh dấu Plotnick

@MarkPlotnick Rõ ràng , USER is root. Với bản chỉnh sửa tôi đã thực hiện, bạn có nghĩ rằng bạn có thể giải thích cách chỉnh sửa tệp cho bất kỳ người dùng không phải root nào thực thi tập lệnh không?
BrassApp Bộ dụng cụ 7/2/2015

@myaut Mình chạy bằng tay từ terminal.
BrassApp Bộ dụng cụ 7/2/2015

Câu trả lời:


8

Nếu, vì một số lý do, $USERkhông được đặt, bạn có thể sử dụng idlệnh để lấy danh tính của người dùng thực. Vì vậy, lần đầu tiên bạn sử dụng $USERbiến, bạn có thể sử dụng mở rộng shell để cung cấp một giá trị mặc định. Thay đổi chowndòng trong tập lệnh của bạn thành:

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

Nếu USERtrống hoặc không được đặt khi chạy, bash sẽ đặt USERbiến thành đầu ra của/usr/bin/id -run


4

Khi tôi gọi kịch bản của mình với sudonó sẽ được đặt $USERthành root.

$ sudo ./myscript.sh

Tôi đã thử chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenamenhưng nó vẫn trả về root.

Tôi tìm thấy nếu tôi sử dụng whovới awktôi đã có thể có được người dùng hiện tại được gọi là tập lệnh sudo.

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

1
Để ngăn cài đặt currentuser(đôi khi) với người dùng nhiều dòng, $(who | awk 'NR==1{print $1}')thay vào đó hãy sử dụng .
Đèn chiếu sáng

Tôi đang cố gắng thay đổi / usr thành người dùng của mình: chown -R $currentuser:$currentuser /usr - không hoạt động - vẫn hiển thị root: root
Sam-T

2

Để đơn giản hóa vấn đề và vì bạn đang nhận được tên trang web biến, tại sao bạn không đọc biến tên người dùng?

Với điều đó, bạn chắc chắn rằng việc thực thi tập lệnh không phụ thuộc vào các biến môi trường có sẵn theo cách tập lệnh được thực thi.


0

Chỉ có một lỗi nhỏ tôi nghĩ. sudo mở một shell mới để thực thi lệnh và sau khi sudo người dùng đã root. Vì vậy, có lẽ bạn nên sử dụng một cái gì đó như thế này:

MYUSER = $ NGƯỜI DÙNG

sudo chown $ MYUSER: $ MYUSER

vì tôi nghĩ MYUSER không bị ghi đè lên hệ thống và sẽ hoạt động.


1
Biến được đánh giá trước khi lệnh được thực thi, do đó, thay thế được đề xuất của bạn sẽ không có sự khác biệt. (Hãy thử echo chown...và xem.)
roaima
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.