Có thể xác định lại dấu ngã ('~', thư mục chính) không?


13

Có thể xác định lại thư mục nhà? ví dụ như để /ext1/usernamethay cho /home/username, tức là mở rộng ~vào thư mục khác (như trái ngược với việc thay đổi thư mục chính thực tế nơi các file nhà của người sử dụng đang nằm).

(Câu hỏi này chủ yếu mang tính học thuật, vì có vẻ như thực hành không tốt. Tôi cũng không có lựa chọn nào khác trong vấn đề sử dụng csh, mặc dù đã đọc Top 10.)


11
Bạn có nghĩa là thay đổi thư mục nhà thực tế, hoặc bạn có nghĩa là làm cho shell mở rộng ~sang một cái gì đó khác với thư mục nhà thực tế?
derobert

Tôi có nghĩa là mở rộng ~thư mục khác (không, nếu tôi hiểu chính xác sự thay thế của bạn, thay đổi vị trí của tất cả các thư mục nhà của người dùng). Tôi đã không nhận ra rằng nó ~được hiểu là một dạng ngắn $HOME, như @michas mô tả trong câu trả lời của anh ấy.
Andrew Cheong

2
Không phải tất cả các thư mục nhà của người dùng, bạn có thể thay đổi chỉ một, như slm hiển thị trong câu trả lời của anh ấy.
derobert

Câu trả lời:


28

Dấu ngã ~được giải thích bởi vỏ của bạn. Vỏ của bạn sẽ giải thích ~như một hình thức ngắn $HOME.

Hãy thử (echo ~; HOME=foo; echo ~). Điều này trước tiên nên in thư mục nhà thực sự của bạn và sau đó "foo", khi bạn đặt $HOMEthành đó.

Giá trị mặc định $HOMEđến từ cấu hình hệ thống của bạn. Sử dụng getent passwdđể liệt kê tất cả người dùng đã biết và thư mục nhà của họ. Tùy thuộc vào cấu hình hệ thống của bạn, các mục đó có thể đến từ /etc/passwdhoặc bất kỳ dịch vụ thư mục từ xa nào.

Nếu bạn chỉ muốn tạm thời xác định lại thư mục chính của mình, chỉ cần đặt một thư mục khác $HOME.

Nếu bạn muốn thay đổi vĩnh viễn, bạn phải thay đổi mục nhập mật khẩu, ví dụ: bằng cách chỉnh sửa thủ công /etc/passwd.


Cảm ơn, @michas. Không thể tin rằng tôi đã bỏ lỡ biến đó. (BTW, hóa ra trong cshbiến có liên quan là $home(chữ thường) và bạn không setenv HOME /ext1/acheongthể chỉ bạn có thể set home=/ext1/acheong, và điều đó có hiệu quả với tôi.)
Andrew Cheong

2
Để thay đổi vĩnh viễn, bạn cũng có thể sử dụngusermod -d
user606723

1
Sử dụng vipw(hoặc bất kỳ GUI nào mà HĐH của bạn cung cấp) thay vì chỉnh sửa /etc/passwdtrực tiếp. Rủi ro chỉnh sửa trực tiếp làm hỏng tập tin, có thể khó phục hồi.
Keith Thompson

11

Giá trị được sử dụng ~được xác định từ giá trị bạn nhận được từ cơ sở dữ liệu quản trị ( getent passwd), thường là trong /etc/passwdtệp, cho mỗi thư mục chính của người dùng được xác định ở đó.

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

Cột thứ 6 trong tệp này là nơi giá trị được sử dụng khi ai đó nhập cd ~từ.

nsswitch

Bạn có thể xem hệ thống sẽ sử dụng gì cho thư mục chính của người dùng bằng lệnh getent passwd:

$ getent passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

"Cơ sở dữ liệu" cung cấp các cơ sở dữ liệu này được kiểm soát thông qua bộ giải quyết hệ thống của bạn, được xác định trong /etc/nsswitch.conf.

$ grep passwd /etc/nsswitch.conf 
#passwd:    db files nisplus nis
passwd:     files

Các tệp trên có nghĩa là /etc/passwd, nhưng "cơ sở dữ liệu" có thể đến từ LDAP, NIS hoặc các vị trí khác trên mạng chẳng hạn.

Di chuyển / xác định lại?

Để thực hiện thao tác này là một chút khó khăn sau khi các tài khoản đã được tạo. Nếu bạn đang tạo tài khoản từ đầu thì việc xác định lại vị trí của người dùng trong thư mục nhà của họ là chuyện nhỏ. Khi chạy useraddlệnh, bạn có thể chỉ định vị trí sẽ được sử dụng cho thư mục chính của người dùng.

Thí dụ

$ useradd -d /ext1/acheong ...

đoạn trích từ trang người đàn ông

-d, --home HOME_DIR
   The new user will be created using HOME_DIR as the value for the users 
   login directory. The default is to append the LOGIN name to BASE_DIR and 
   use that as the login directory name. The directory HOME_DIR does not 
   have to exist but will not be created if it is missing.

Đối với các tài khoản hiện có?

Điều này trở thành một hoạt động phẫu thuật nhiều hơn vì thường thì đường dẫn của thư mục chính của người dùng được đưa vào tĩnh trong các tệp cấu hình, làm cho nó trở nên phức tạp hơn.

Thí dụ

$ grep home /home/sam/.*
/home/sam/.gtkrc-1.2-gnome2:include "/home/sam/.gtkrc.mine"

Những điều này sẽ cần phải được sửa chữa, hoặc bạn sẽ phải cung cấp một liên kết từ /home/samvị trí mới , /ext1/sam.

Di chuyển khi "cơ sở dữ liệu" không /etc/passwd

Nếu hệ thống nhận các thư mục chính từ LDAP, NIS, v.v. thì bạn sẽ cần phải xác định vị trí di chuyển trong các hệ thống đó và phối hợp với việc di chuyển các tệp từ /home/samsang /ext1/sam.

Người giới thiệu


Tất nhiên, việc thay đổi sẽ yêu cầu di chuyển các tập tin của người dùng. Và có lẽ để lại một liên kết tượng trưng ở vị trí cũ (vì nếu không thì rất nhiều thứ sẽ bị phá vỡ ...)
derobert

@derobert - yeah đã làm điều này một vài lần, tôi cố gắng tránh nó như bệnh dịch hạch.
slm

@slm - Cảm ơn câu trả lời chi tiết như vậy (và một chút lịch sử). Tôi sợ rằng tôi đang tìm cách làm một cái gì đó đơn giản hơn nhiều và tôi không biết gì về sự tồn tại của một biến môi trường đại diện cho thư mục chính của phiên. Tuy nhiên, tôi chắc chắn câu trả lời của bạn sẽ giúp người đọc khác trong tương lai. Cảm ơn một lần nữa.
Andrew Cheong

1

Nếu lý do là để phổ biến người dùng trên nhiều hệ thống tệp, bạn cũng có thể sử dụng automounter. Và thậm chí cho phép bạn có một thư mục "cơ sở" khác cho người dùng của bạn.

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.