Tilde ('~', giriş dizini) yeniden tanımlamak mümkün mü?


13

Giriş dizinini yeniden tanımlamak mümkün mü? örneğin etmek /ext1/usernameyerine /home/username, yani genişleyen ~(kullanıcıların ev dosyaların bulunduğu fiili giriş dizinini değiştirme aksine) başka bir dizine.

(Bu soru çoğunlukla akademiktir, çünkü bunu yapmak kötü bir uygulama gibi görünmektedir. cshİlk 10'u okumuş olsam da, kullanma konusunda başka seçeneğim de yok .)


11
Gerçek giriş dizinini değiştirmek mi demek istersiniz , ya da kabuğun ~gerçek giriş dizininden başka bir şeye genişletilmesini mi kastediyorsunuz ?
derobert

~Başka bir dizine genişletmek istedim (alternatifinizi doğru anlarsam, tüm kullanıcıların ev dizinlerinin nerede değiştirileceğini değil). Bunun ~kısa bir form olarak yorumlandığını $HOME, cevabında @michas olarak yorumlandığını fark etmedim .
Andrew Cheong

2
Tüm kullanıcıların ev dizinleri değil , cevaplarında slm gösterdiği gibi sadece bir tanesini değiştirebilirsiniz.
derobert

Yanıtlar:


28

Dalga ~, kabuğunuz tarafından yorumlanır. Kabuğunuz ~kısa bir biçimi olarak yorumlayacaktır $HOME.

Deneyin (echo ~; HOME=foo; echo ~). Bu, önce gerçek giriş dizininizi ve daha sonra "foo" olarak ayarlamanız $HOMEgerekir.

Varsayılan değeri $HOMEsistem yapılandırmanızdan gelir. getent passwdBilinen tüm kullanıcıları ve ev dizinlerini listelemek için kullanın . Sistem yapılandırmanıza bağlı olarak, bu girişler /etc/passwdveya herhangi bir uzak dizin hizmetinden gelebilir .

Ana dizininizi yalnızca geçici olarak yeniden tanımlamak istiyorsanız, başka bir tane ayarlayın $HOME.

Kalıcı olarak değiştirmek isterseniz, passwd girişini, örneğin manuel olarak düzenleyerek değiştirmeniz gerekir /etc/passwd.


Teşekkürler @michas. Bu değişkeni kaçırdığımı düşünemiyorum. (BTW, cshilgili değişkente ortaya çıkıyor $home(küçük harf) ve yapamazsınız setenv HOME /ext1/acheong- sadece yapabilirsiniz set home=/ext1/acheongve bu benim için çalıştı.)
Andrew Cheong

2
Kalıcı olarak değiştirmek için şunları da kullanabilirsinizusermod -d
user606723

1
Kullanım vipw(veya OS sağlar ne olursa olsun GUI) yerine düzenleme daha /etc/passwddoğrudan. Doğrudan düzenleme, dosyayı bozmanın zor olabileceği bozan riskler.
Keith Thompson

11

Kullanılan değer, orada tanımlanan her kullanıcının ana dizini ~için yönetim veritabanından ( getent passwd), genellikle /etc/passwddosyada aldığınız değerden belirlenir.

$ 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

Bu dosyadaki 6. sütun, birisi cd ~geldiğinde kullanılan değerin bulunduğu yerdir .

nsswitch

Şu komutu kullanarak bir sistemin kullanıcının ana dizini için ne kullanacağını görebilirsiniz 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

Bunları sağlayan "veritabanı", sistem tanımlayıcısı tarafından tanımlanır /etc/nsswitch.conf.

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

Yukarıdaki dosyalar anlamına gelir /etc/passwd, ancak "veritabanı" LDAP, NIS veya ağ üzerindeki diğer konumlardan gelebilir.

Hareketli / yeniden tanımlanması?

Hesaplar oluşturulduktan sonra bu işlemi gerçekleştirmek biraz zordur. Hesapları sıfırdan oluşturuyorsanız, kullanıcının ana dizininin konumunu yeniden tanımlamak önemsizdir. useraddKomutu çalıştırırken, kullanıcının ana dizini için kullanılacak konumu belirleyebilirsiniz.

Misal

$ useradd -d /ext1/acheong ...

man sayfasından alıntı

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

Mevcut hesaplar için mi?

Bir kullanıcının ana dizininin yolunun yapılandırma dosyalarına statik olarak dahil edilmesinden dolayı, daha karmaşık hale geldiği için bu daha cerrahi bir işlem haline gelir.

Misal

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

Bunların düzeltilmesi veya /home/samyeni konuma bir bağlantı sağlamanız gerekir /ext1/sam.

"Veritabanı" olmadığında taşıma /etc/passwd

Sistem vb LDAP, NIS, ev dizinleri elde edilirse o zaman bu sistemlerde yer değiştirme peform gerekir ve dosya taşıma ile koordine edeceğiz /home/sametmek /ext1/sam.

Referanslar


Tabii ki, bu kullanıcının dosyalarının taşınmasını gerektirecektir. Ve muhtemelen eski bir yerde bir symlink bırakarak (aksi takdirde bir çok şey kırılacaktır ...)
derobert

@derobert - evet bunu veba gibi önlemek için birkaç kez yaptıktan sonra.
slm

@slm - Bu kadar ayrıntılı bir cevap (ve tarihin biraz) için teşekkürler. Korkarım ki çok daha basit bir şey yapmak istiyordum - ve oturumun ana dizinini temsil eden bir ortam değişkeninin varlığından habersizdim. Ancak cevabınızın gelecekte başka bir okuyucuya yardımcı olacağından eminim. Tekrar teşekkürler.
Andrew Cheong

1

Nedeni, kullanıcıları birden fazla dosya sistemine yaymaksa automounter,. Ve hatta kullanıcılarınız için farklı bir "temel" dizine sahip olmanıza izin verin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.