Tanda pagar melarikan diri (#) di / etc / environment

17

Saya menambahkan variabel env ke /etc/environmenttetapi karena nilai variabel berisi tanda #, string bergaris.

MYSQL_PWD="something#no"

Sekarang jika saya envmenghasilkan kode di atas MYSQL_PWD=something. Bagaimana saya bisa lolos hash? Saya sudah mencoba \karakter.

Umair A.
sumber
Apakah Anda yakin memposting hal yang persis sama dengan yang Anda masukkan /etc/environment? Karena saya tidak bisa menduplikasi perilaku ini di Debian Wheezy.
Joseph R.
Ekspor maaf tidak ada. Diperbarui pertanyaan saya.
Umair A.
Untuk saat ini saya telah mengubah MySQL pwd :(
Umair A.
Saya berhasil menduplikasi perilaku Anda. Saya tidak menyadari bahwa saya perlu keluar lalu kembali untuk mendapatkan shell saya untuk dibaca /etc/environment.
Joseph R.
@ JosephephR. - Saya menduplikasi ini dan terkejut juga. Melihat ke peran file ini tampaknya konsisten dengan niatnya.
slm

Jawaban:

18

Tampaknya ini tidak mungkin dilakukan /etc/environment. Ini dimaksudkan sebagai lokasi umum untuk variabel yang tidak bergantung pada shell. Mengingat ini tidak terlihat seperti itu mendukung string dengan tanda hash ( #) di dalamnya dan tampaknya tidak ada cara untuk melarikan diri mereka.

Saya menemukan T&J SF ini berjudul: Bagaimana seseorang bisa lolos dari karakter “#” terkemuka di linux etc / environment? . Tidak satu pun dari metode ini yang berfungsi:

  • control = "halo"
  • test0 = "# halo"
  • test1 = "h \ #ello"
  • test2 = "h # ello"
  • test3 = "h // # ello"
  • test4 = "h / # ello"
  • test5 = h # ello
  • test6 = h \ #ello
  • test7 = h # ello
  • test8 = h // # ello
  • test9 = h / # ello
  • test10 = 'h # ello'
  • test11 = 'h \ #ello'
  • test12 = 'h # ello'
  • test13 = 'h // # ello'
  • test14 = 'h / # ello'

Jawaban yang diterima untuk pertanyaan itu dan apa yang juga akan menjadi saran saya:

Yah itu adalah hal-hal rumit yang ingin Anda lakukan /etc/environmentbukan sintaksis shell, sepertinya, tetapi tidak, yang membuat orang frustrasi. Gagasan di balik /etc/environmentitu luar biasa. Cara shell-independent untuk mengatur variabel! Yay! Tetapi keterbatasan praktis membuatnya tidak berguna.

Anda tidak dapat melewatkan variabel di sana. Coba misalnya masukkan MAIL=$HOME/Maildir/ke dalamnya dan lihat apa yang terjadi. Terbaik hanya untuk berhenti mencoba menggunakannya untuk tujuan apa pun, sayangnya. Jadi Anda tidak dapat melakukan hal-hal yang Anda harapkan dapat dilakukan jika itu diproses oleh shell.

Gunakan /etc/profileatau /etc/bashrc.

Namun masih ada lagi tanya jawab yang memberikan alasan mengapa ini terjadi:

Tidak ada cara /etc/environmentuntuk keluar dari # (karena diperlakukan sebagai komentar) karena sedang diuraikan oleh dia modul PAM "pam_env" dan memperlakukannya sebagai daftar sederhana pasangan KEY = VAL dan mengatur lingkungan yang sesuai. Ini bukan bash / shell, parser tidak memiliki bahasa untuk melakukan ekspansi variabel atau karakter melarikan diri.

Referensi

slm
sumber
apakah itu bug atau ada alasan di baliknya?
Umair A.
1
@UmairAshraf - bukan bug, hanya fungsionalitas terbatas yang diberikan peran file ini. File ini menjangkau berbagai teknologi shell sehingga harus menggunakan fitur yang didukung di semua shell yang akan digunakan.
slm
betapa bodohnya; ini seharusnya menggunakan format yang sama dengan /proc/environ.
Kaz
1

Mungkin terlambat, tetapi tiga backslash sebelum #bekerja untuk saya.

Jika kata sandinya, katakan "admin # 123", Anda dapat mendefinisikannya sebagai

admin\\\#123
Sai Sivaram
sumber
Ini tidak berfungsi untuk saya dalam /etc/environmentfile.
Joey V.