Saya bermain-main dengan alias hari ini dan saya perhatikan bahwa alias tidak tersedia saat menggunakan sudo
:
danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout
danny@kaon:~$ sudo ll -d /
sudo: ll: command not found
Apakah ada alasan mengapa Anda tidak dapat menggunakan alias saat menggunakan sudo
?
/root/.bashrc
tidak bisa dibaca saat menjalankan perintah melalui sudo.sudo -i
?Jawaban:
Tambahkan baris berikut ke Anda
~/.bashrc
:Dari manual bash :
(Penekanan milikku).
Bash hanya memeriksa kata pertama dari sebuah perintah untuk alias, kata-kata setelah itu tidak dicentang. Itu berarti dalam perintah seperti
sudo ll
, hanya kata pertama (sudo
) diperiksa oleh bash untuk alias,ll
diabaikan. Kami dapat memberitahu bash untuk memeriksa kata berikutnya setelah alias (yaitusudo
) dengan menambahkan spasi ke akhir nilai alias.sumber
sudo -H ll
?Saya menulis fungsi Bash untuk bayangan itu
sudo
.Ia memeriksa apakah saya memiliki alias untuk perintah yang diberikan dan menjalankan perintah alias alih-alih yang literal dengan
sudo
dalam kasus itu.Inilah fungsi saya sebagai satu-liner:
Atau diformat dengan baik:
Anda dapat menambahkannya ke
.bashrc
file Anda , jangan lupa untuk sumbernya atau mulai kembali sesi terminal Anda setelah itu untuk menerapkan perubahan.sumber
Alias adalah khusus pengguna - Anda harus mendefinisikannya
/root/.bashrc
sumber
sudo -s
atausudo -i
(dan hanya jika dijalankan dengan sendirinya untuk mendapatkan shell root, bukan dengansudo -s command...
atausudo -i command...
bentuk) atausudo bash
atausudo su
, atau situasi di mana Anda Sudah mengaktifkan login root dan memiliki shell root seperti itu. Ketika pengguna non-root berjalansudo command...
dari shell mereka sendiri, ekspansi alias dilakukan oleh shell non-root mereka sendiri.sudo
tidak dengan sendirinya memperluas alias, sehingga sebagaimana diterapkan pada situasi yang dijelaskan dalam pertanyaan , jawaban ini salah.@Alvins jawaban adalah yang terpendek. Tanpa keraguan! :-)
Namun saya memikirkan solusi baris perintah untuk mengeksekusi perintah alias di sudo di mana tidak perlu mendefinisikan ulang
sudo
denganalias
perintah.Berikut adalah proposal saya untuk mereka yang tertarik:
Larutan
Contoh
Dalam hal
ll
perintahPenjelasan
ketika Anda memiliki alias (seperti :)
ll
perintahtype -a
mengembalikan ekspresi alias:dengan
grep
Anda memilih teks antara aksen `dan apostrof 'dalam kasus ituls -l
Dan
xargs
mengeksekusi teks yang dipilihls -l
sebagai parametersudo
.Ya, sedikit lebih lama tetapi sepenuhnya bersih ;-) Tidak perlu mendefinisikan kembali
sudo
sebagai alias.sumber
alias
builtin, karena outputnya lebih bersih.alias ll
outputalias ll='ls -ahlF'
.alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo
.sudo -i
terlebih dahulu, untuk menjalankan perintah alias, tetapi langsung melakukannya. Memiliki perintah yang rumit mengalahkan itu. Anda bisa melakukan yang pertama, dan lebih cepat.Saya punya solusi bagus lain, yang menambahkan sedikit kepercayaan juga:
Gunakan penyelesaian bash untuk secara otomatis mengganti kata-kata di belakang
sudo
dengan alias mereka saat menekan tab.Simpan ini sebagai
/etc/bash_completion.d/sudo-alias.bashcomp
, dan itu akan secara otomatis dimuat pada startup shell interaktif:Kemudian masuk ke terminal baru, dan Anda harus pergi dengan baik.
sumber
compgen -a
sudo ll
), tekan [TAB ↹], dan skrip menemukanll
dalam daftar tugas alias, memotong apa yang ditugaskan kepadanya, dan menyisipkan itu. (Jadi Anda akan mendapatkan missudo ls -lahvF --color=auto --time-style=long-iso
.)Saya punya solusi berbeda di mana Anda tidak perlu menambahkan
sudo
sebagai alias. Saya menjalankan Linux Mint 17.3 tetapi harus sangat mirip dengan Ubuntu.Ketika Anda root, maka
.profile
dijalankan dari direktori home-nya. Jika Anda tidak tahu apa direktori home di bawah root, maka Anda dapat memeriksa:Seperti yang Anda lihat, rumah
root
itu/root/
. Periksa isinya:Seharusnya ada
.profile
file. Buka file dan tambahkan baris berikut:Pada dasarnya, apa yang dilakukan skrip bash ini adalah memeriksa file yang dipanggil
.bash_aliases
. Jika file ada, itu mengeksekusi file.Simpan
.profile
file dan buat alias Anda di.bash_aliases
. Jika Anda sudah menyiapkan file alias, salin file ke lokasi iniLuncurkan ulang terminal dan Anda siap berangkat!
sumber
Jawaban terpilih teratas adalah jawaban yang bagus. Namun, jika Anda mengetik
sudo -i
dan menaikkan ke sudo prompt (#
) Anda tidak akan memiliki alias yang ingin Anda gunakan.Untuk memanfaatkan alias Anda (dan yang lainnya) saat
#
diminta, gunakan:Di mana "$ PWD" diperluas secara otomatis ke "/ home / YOUR_USER_NAME"
sumber
@ WinEunuuchs2Unix:
$PWD
memperluas ke "direktori kerja sekarang". Saya pikir kamu mau$HOME
.Juga, untuk sebagian besar situasi, mungkin yang terbaik adalah memiliki file root .bashrc yang terpisah. Bahkan, saya akan membuatnya menjadi file nyata
/root
, tautan lunak untuk itu di direktori home pengguna (misalnya,.bashrc_root
), dan sumber dari file pengguna.bashrc
. Jika suatu saat nanti akun pengguna istimewa ini tidak lagi ada,.bashrc
file root masih tersedia untuk pengguna lain.sumber