Apakah mungkin untuk mendefinisikan ulang tilde ('~', direktori home)?

13

Apakah mungkin untuk mendefinisikan ulang direktori home? misalnya untuk /ext1/usernamebukannya /home/username, yaitu memperluas ~ke direktori lain (yang bertentangan dengan mengubah direktori home aktual di mana file home pengguna berada).

(Pertanyaan ini sebagian besar bersifat akademis, karena sepertinya praktik buruk untuk melakukannya. Saya juga tidak punya pilihan dalam hal menggunakan csh, meskipun telah membaca Top 10.)

Andrew Cheong
sumber
11
Apakah maksud Anda mengubah direktori home yang sebenarnya, atau maksud Anda membuat shell berkembang ~menjadi sesuatu selain direktori home yang sebenarnya?
derobert
Saya bermaksud memperluas ~ke direktori lain (tidak, jika saya memahami alternatif Anda dengan benar, mengubah di mana direktori home semua pengguna berada). Saya tidak menyadari bahwa ~itu ditafsirkan sebagai bentuk pendek $HOME, seperti yang dijelaskan @michas dalam jawabannya.
Andrew Cheong
2
Tidak semua direktori home pengguna, Anda dapat mengubah hanya satu, seperti yang ditunjukkan slm dalam jawabannya.
derobert

Jawaban:

28

Tilde ~ditafsirkan oleh shell Anda. Shell Anda akan ditafsirkan ~sebagai bentuk singkat dari $HOME.

Coba (echo ~; HOME=foo; echo ~). Ini pertama-tama harus mencetak direktori home asli Anda dan kemudian "foo", saat Anda mengaturnya $HOME.

Nilai default dari $HOMEberasal dari konfigurasi sistem Anda. Gunakan getent passwduntuk mendaftar semua pengguna yang dikenal dan direktori home mereka. Bergantung pada konfigurasi sistem Anda, entri tersebut mungkin berasal dari /etc/passwdatau layanan direktori jarak jauh.

Jika Anda hanya ingin mendefinisikan ulang sementara direktori home Anda, cukup atur yang lain $HOME.

Jika Anda ingin mengubahnya secara permanen, Anda harus mengubah entri passwd, misalnya dengan mengedit secara manual /etc/passwd.

michas
sumber
Terima kasih, @michas. Tidak percaya saya melewatkan variabel itu. (BTW, ternyata dalam cshvariabel yang relevan adalah $home(huruf kecil), dan Anda tidak setenv HOME /ext1/acheongbisa — Anda hanya bisa set home=/ext1/acheong, dan itu berhasil bagi saya.)
Andrew Cheong
2
Untuk mengubahnya secara permanen, Anda juga dapat menggunakanusermod -d
user606723
1
Gunakan vipw(atau GUI apa pun yang disediakan OS Anda) daripada mengedit /etc/passwdsecara langsung. Pengeditan langsung berisiko merusak file, yang mungkin sulit dipulihkan.
Keith Thompson
11

Nilai yang digunakan ~ditentukan dari nilai yang Anda dapatkan dari database administrasi ( getent passwd), biasanya dalam /etc/passwdfile, untuk setiap direktori home pengguna yang ditentukan di sana.

$ 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

Kolom ke-6 dalam file ini adalah tempat nilai yang digunakan saat seseorang mengetik cd ~berasal.

nsswitch

Anda dapat melihat sistem apa yang akan digunakan untuk direktori home pengguna menggunakan perintah 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

"Basis data" yang menyediakan ini dikendalikan melalui penyelesai sistem Anda, yang didefinisikan dalam /etc/nsswitch.conf.

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

File di atas berarti /etc/passwd, tetapi "basis data" dapat berasal dari LDAP, NIS, atau lokasi lain melalui jaringan, misalnya.

Pindah / Definisi Ulang?

Untuk melakukan operasi ini agak sulit setelah akun dibuat. Jika Anda membuat akun dari awal, maka sepele untuk mendefinisikan kembali lokasi pengguna dari direktori home mereka. Saat menjalankan useraddperintah, Anda dapat menentukan lokasi yang akan digunakan untuk direktori home pengguna.

Contoh

$ useradd -d /ext1/acheong ...

kutipan dari halaman manual

-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.

Untuk akun yang ada?

Ini menjadi lebih dari operasi bedah karena sering kali jalur direktori home pengguna dimasukkan secara statis dalam file konfigurasi, menjadikannya lebih rumit.

Contoh

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

Ini perlu diperbaiki, atau Anda harus memberikan tautan dari /home/samke lokasi baru /ext1/sam,.

Pindah ketika "database" tidak /etc/passwd

Jika sistem mendapatkan direktori home dari LDAP, NIS, dll. Maka Anda perlu mengatur relokasi dalam sistem tersebut, dan berkoordinasi dengan memindahkan file dari /home/samke /ext1/sam.

Referensi

slm
sumber
Tentu saja, perubahan itu akan membutuhkan pemindahan file pengguna. Dan mungkin meninggalkan symlink di tempat lama (karena jika tidak banyak hal akan rusak ...)
derobert
@derobert - ya setelah melakukan ini beberapa kali saya mencoba menghindarinya seperti wabah.
slm
@slm - Terima kasih atas jawaban terinci (dan sedikit sejarah). Saya khawatir saya ingin melakukan sesuatu yang lebih sederhana — dan saya tidak mengetahui keberadaan variabel lingkungan yang mewakili direktori home sesi. Saya yakin jawaban Anda akan membantu pembaca lain di masa depan. Terima kasih lagi.
Andrew Cheong
1

Jika alasannya adalah untuk menyebar pengguna di beberapa sistem file, Anda juga bisa menggunakan automounter. Dan bahkan memungkinkan Anda untuk memiliki direktori "basis" yang berbeda untuk pengguna Anda.

sleepyweasel
sumber