2011-09-09 31 views

Trả lời

26

Thư mục chính của người dùng sẽ là ~$SUDO_USER. Bạn có thể sử dụng eval như sau:

USER_HOME=$(eval echo ~${SUDO_USER}) 
echo ${USER_HOME} 
+2

Cố gắng tránh' eval'. Xem câu trả lời của tôi mà không có 'eval'. –

+0

Bạn không cần 'eval' ở đây. '~' Là mở rộng shell, vì vậy 'echo ~ user' là đủ. – Craig

+1

Có, bạn cần 'eval' vì người dùng được lưu trữ trong một biến. – dogbane

3

Thử truy cập các biến môi trường $ SUDO_USER

+2

Ví dụ: 'sudo sh -c 'echo ~ $ SUDO_USER'' – l0b0

8
$ sudo env |grep USER 
USER=root 
USERNAME=root 
SUDO_USER=glglgl 

Vì vậy, bạn có thể truy cập $SUDO_USER và yêu cầu hệ thống cho homedir của mình với getent passwd $SUDO_USER | cut -d: -f6.

39

Cố gắng tránh eval. Đặc biệt với gốc perms.

Bạn có thể làm:

USER_HOME=$(getent passwd $SUDO_USER | cut -d: -f6) 

Cập nhật:

here là lý do để tránh eval.

+0

Tôi đã cuộn lại bài đăng gốc. Đề xuất đơn giản hóa không chính xác. –

+0

@downvoter: Nếu bạn downvote, sau đó xin vui lòng để lại bình luận gì là sai trong ý kiến ​​của bạn. Nếu không thì nó không mang tính xây dựng. Cảm ơn bạn. –

+0

Tôi đoán downvote là do thiếu lời giải thích để tránh eval? Tôi rất muốn biết lý do để tránh nó ngay bây giờ! – bunnydrug

2

Trừ khi tôi hiểu sai câu hỏi, khi người dùng chạy tập lệnh với sudo, biến môi trường $HOME không thay đổi. Để kiểm tra, tôi tạo ra kịch bản này:

#!/bin/bash 
#sudo_user.sh 
env | grep -e USER -e HOME 

... và chạy nó:

sudo ./sudo_user.sh 

Output:

USER=root 
HOME=/home/haiv 
USERNAME=root 
SUDO_USER=haiv 

Sản lượng nói với tôi rằng $HOME vẫn trỏ đến các nhà của người dùng (trong trường hợp này là /home/haiv).

Các vấn đề liên quan