Làm thế nào để thoát khỏi dấu chấm than đúng cách trong bash?


11

Hôm nay, tôi đã bị bắt quả tang khi đang cố mã hóa trình tạo mật khẩu cho Twitter.

import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))

90 ký tự. Vì đó là rất nhiều không gian trống, tôi quyết định nâng thanh và làm cho nó thực thi được.

echo -e "#!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg

139 ký tự. Tốt đẹp, ngoại trừ rõ ràng bash cuộn cảm vào dấu chấm than.

badp@delta:~$ echo -e "#!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg
bash: !/usr/bin/python\nimport: event not found

Dấu chấm than. "Hãy thoát khỏi nó," tôi nghĩ! Tôi có một nhân vật phụ tùng sau tất cả.

echo -e "#\!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg

Chắc chắn...

badp@delta:~$ echo -e "#\!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg
./pg: line 2: syntax error near unexpected token `('
./pg: line 2: `import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))'
badp@delta:~$ cat pg
#\!/usr/bin/python
import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))

Bỏ golf asinine của tôi sang một bên - tôi không thể giải thích điều này.

Với \!, dấu chấm than đã được thoát ra, ngoại trừ nó thực sự không phải, bởi vì cái \!còn lại là echođể lấy.

Một giải pháp có thể đã được sử dụng \x21thay thế, nhưng tôi không tin đó là cách thoát khỏi dấu chấm than thích hợp trong lệnh bash.

tl; dr: Làm thế nào để bạn thoát khỏi dấu chấm than trong lệnh bash?


Có ai thực sự sử dụng !eventcú pháp ở nơi đầu tiên? Nó luôn luôn gây rắc rối cho tôi.
badp

Câu trả lời:


7

Sử dụng dấu ngoặc đơn:

echo -e '#!/usr/bin/python\nimport string as s,random;print "".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg

Các quy tắc !được sắp xếp ghép vào các quy tắc trích dẫn khác sau đó (từ csh). Chúng rất hữu ích khi các shell không chỉnh sửa dòng lệnh, nhưng một số người vẫn sử dụng chúng.

PS Vì bạn đang mã hóa bash:

echo $'#!/usr/bin/python\nimport string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg

Điều này hoạt động trên hầu hết các đơn vị:

echo python -c \''import string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'\'>pg;chmod +x pg;./pg

(Không phải tôi hiểu lý do tại sao bạn muốn tạo tập lệnh hoặc tại sao tên tập lệnh phải có hai chữ cái.)


Không biết về $''. :) PS: Đó là để thử và sử dụng hết các ký tự dự phòng. Tôi có một cảm giác lãng phí khi tôi đăng tweet ngắn hơn 140 ký tự.
badp

@badp: Vì vậy, hãy cố gắng làm cho nó tạo mật khẩu đáng nhớ . (Như trong pwgenso với pwgen -s.)
Gilles 'SO- ngừng trở thành ác quỷ'

Cũng có thể sử dụng Dadadodo cho các cụm mật khẩu đáng nhớ nhưng vô nghĩa sau đó :)
badp

1

Tôi nên có Googled trước khi tôi hỏi.

Vì bạn không phụ thuộc vào bash để mở rộng biến [..] nên bạn có thể sử dụng dấu ngoặc đơn thay thế. Chuỗi trong dấu ngoặc đơn không được mở rộng bằng bash.

honk trong bài trả lời để Làm thế nào để thoát khỏi một dấu chấm than?


1
Tuy nhiên, tôi không đánh dấu câu trả lời này là được chấp nhận vì nó chỉ trả lời cho trường hợp cụ thể này. Nói chung, bạn không thể đi xa mà không mở rộng.
badp
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.