Skip to main content

Posts

Showing posts with the label bash

[TIL] script cài Rust dùng 20 bytes đầu để nhận biết hệ thống

Cách cài đặt chính thức đươc khuyên dùng tại trang chủ https://www.rust-lang.org/tools/install : curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh nhưng... curl | sh thường bị xem là nguy hiểm, do người dùng thường không kiểm tra nội dung sript. Vậy hãy tải nó về và đọc: $ curl -Lo rustup.sh https://sh.rustup.rs % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 26495 100 26495 0 0 149k 0 --:--:-- --:--:-- --:--:-- 149k Đọc code #!/bin/sh # shellcheck shell=dash # shellcheck disable=SC2039 # local is non-POSIX # This is just a little script that can be downloaded from the internet to # install rustup. It just does platform detection, downloads the installer # and runs it. ... # It runs on Unix shells like {a,ba,da,k,z}sh. đây là 1 file shell code, thậm chí không dùng bash mà dùng dash (POSIX compliant), sử dụng shellcheck để chec...

Đọc code bash xem vì sao echo * không hiện tên file ẩn

glob là gì $ whatis glob glob (7) - globbing pathnames Gõ man 7 glob có viết: NAME glob - globbing pathnames DESCRIPTION Long ago, in UNIX V6, there was a program /etc/glob that would expand wildcard patterns. Soon afterward this became a shell built-in. glob là khái niệm để "match" (chọn) filename sử dụng "pattern", gần giống với Regular Expression. Ví dụ trên shell gõ ls *.py sẽ hiện tên các file có đuôi .py . Điểm khác biệt so với Regular Expression: glob chỉ dùng để match filename, và các ký tự đặc biệt trong glob có ý nghĩa khác so với Regular Expression (ví dụ * có nghĩa khác). Wildcard pattern là gì Một string là 1 wildcard pattern nếu chứa ? * hoặc [ , glob là việc biến wildcard pattern thành list các filename "match" pattern. A '?' (not between brackets) matches any single character. A '*' (not between brackets) matches any string, including the empty string. Ví dụ $ touch error.c ...

bash chậm tới mức nào?

trên những môi trường không có ngôn ngữ nào khác, bash vẫn là lựa chọn duy nhất: docker entrypoint (script chạy 1 chương trình phức tạp trong docker) bash không dùng để viết chương trình cần hiệu năng cao, nhưng liệu bash chậm tới mức nào? Tính tổng từ 1 đến 1 triệu #1 x=0 for i in {1..1000000} ; do x=$((x+i)) done echo "$x" #2 x=0 for i in $(seq 1 1000000) ; do x=$((x+i)) done echo "$x" #3 x=0 for ((i=1;i<=1000000;i++)); do x=$((x+i)) done echo "$x" #4 x=0 i=1 while [ $i -le 1000000 ]; do x=$((x+i)) i=$((i+1)) done echo "$x" Trong 4 cách trên, cách 1 với {1..1000000} tạo 1 triệu phần tử trong RAM (như Python dùng list(range(1,1_000_001)) ), dùng hết 284MB RAM. cách 2 với seq 1 1000000 chỉ dùng 3.7MB RAM, nhưng phụ thuộc vào chương trình seq bên ngoài cách 3 và 4 tương tự nhau nhưng cách 4 chạy trên tất cả cách loại (POSIX) shell. Dùng shellcheck để biết cách 3 không chạy trên sh : $ sudo apt install -...

Truy cập website chỉ với TCP socket - Python, Perl, Bash

Thời đại ngày nay khi mọi ngôn ngữ lập trình đều có sẵn hay dễ dàng cài thư viện HTTP client, HTTP dần trở thành "hộp đen" ít người thọc vào táy máy. Chỉ có 1 TCP socket, liệu có kết nối HTTP được không? let's do it CHÚ Ý: HTTP, không phải HTTPS HTTP/1.1 protocol Truy cập: HTTP/1.0 hay HTTP/1.1 là protocol (giao thức) dùng text, chỉ cần gửi các string đi là nhận được response. Cấu trúc 1 HTTP/1.x request: CRLF là Carriage Return and Line Feed \r\n HTTP request format Method Request-URI HTTP-Version CRLF headers CRLF message-body Chạy HTTP server có sẵn ở python3 $ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 127.0.0.1 - - [31/Aug/2023 19:06:49] "GET / HTTP/1.1" 200 - Gửi HTTP request bằng lệnh nc (netcat) $ nc localhost 8000 GET / HTTP/1.1 header1=value HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.11.3 Date: Thu, 31 Aug 2023 12:06:49 GMT Content-type: text/html; charset=utf-8 Content-Length: 6504 ... Gửi HT...

Vài khoảng trắng không xóa đi lịch sử

Người dùng Ubuntu có một bí kíp để khiến cho câu lệnh vừa gõ trong bash không hiện trong lệnh "history": thêm dấu space trước khi gõ lệnh: $ docker run -it ubuntu:22.04 [0] root@19b65c7de3f6:/# echo you see me you see me root@19b65c7de3f6:/# echo you do not see my password is hunter42 you do not see my password is hunter42 root@19b65c7de3f6:/# history 1 echo you see me 2 history root@19b65c7de3f6:/# echo $HISTCONTROL ignoredups:ignorespace Bí kíp này ... chỉ có ở trên Ubuntu bash. Photo by Ling Tang on Unsplash HISTCONTROL Trong bash, biến môi trường HISTCONTROL dùng để config shell sẽ lưu cái gì vào "history". Mặc định trên Ubuntu từ xưa tới nay có giá trị: ignoredups:ignorespace Nhưng điều này không đúng trên Debian cũng như nhiều hệ điều hành khác như MacOS , cũng không đúng trên zsh (HIST_IGNORE_SPACE). $ docker run -it debian:bullseye-slim ...

Các combo câu lệnh CLI từ năm 2021

Sau hơn 10 năm dùng Ubuntu/OSX/OpenBSD, các combo câu lệnh mình sử dụng đã có nhiều thay đổi, bài này sẽ cập nhật các combo hay dùng nhất: ls ls -la vốn là combo ưa thích, thì ngày nay, tay đã quen với 2 combo khác: ls -Fhtl hiển thị file và sắp xếp theo file mới nhất ở trên đầu ls -lFS hiển thị file theo size giảm dần (dễ nhớ: LinuxFromScratch ) free -m free là câu lệnh chỉ có trên Linux như Ubuntu, trên OSX và OpenBSD đều không có, vậy nên dùng top | head sẽ thay thế được cho lệnh free. Combo sau khi login vào 1 máy sẽ là: w; df -h; top | head grep Vẫn là combo grep -Rin pattern dir nhưng ngày nay mình đã thay grep bằng ripgrep nên thường chỉ gõ rg pattern dir ripgrep nhanh hơn grep nhiều lần, chú ý khi tìm file "ẩn"/ignored . curl curl vốn phổ biến như 1 CLI HTTP client tiện dùng khi dev, nhưng curl không có sẵn ở nhiều nơi như wget (ubuntu, busybox mặc định, trong các Alpine based container). $ curl -L -o elm.gz https://github.com/elm/compiler/rele...

bash, shopt và =, **

bash là UNIX shell được dùng nhiều nhất hành tinh này. bash có ở khắp mọi hệ điều hành Linux based, hay kể cả OSX/MacOS cho tới tháng 10 năm 2019 (khi Apple quyết định thay zsh làm shell mặc định trên MacOS) .  Sự thay đổi này của Apple khiến cho bạn nếu vẫn "chày cối" dùng bash sẽ gặp phải một số bất lợi nhất định (tất nhiên là khắc phục được). Trên MacOS, phiên bản của bash có sẵn rất cũ, vẫn là bash 3.X. Trong khi Ubuntu 18.04 đã dùng 4.4, còn Ubuntu 20.04 thì dùng hẳn bash 5.0.    Photo by Clement Chai on Unsplash Chuyện này hoàn toàn không phải vấn đề nếu người dùng macOS chủ động cài phiên bản bash mới nhất bằng brew . Cho đến một ngày có người hỏi: câu lệnh ls nào trên bash để liệt kê ra tất cả file .pyc trong tất cả các thư mục con hiện tại? Việc này hoàn toàn làm được với ` find . -name '*.pyc' -type f `, nhưng với ls thì??? 

Để trở thành DevOps Engineer

DevOps là một từ khóa công nghệ cực hot trong khoảng 2015-2018, đánh dấu sự thay đổi về quy trình phát triển phần mềm trên toàn Trái Đất. Tại thời điểm viết bài (2019-05), vị trí này đã có mặt ở hầu hết các công ty công nghệ tại Việt Nam. Bài viết này giải thích các khái niệm liên quan tới DevOps, đưa ra một giáo trình để trở thành DevOps Engineer. ## DevOps là gì DevOps không có định nghĩa chính thức, cũng không có định nghĩa rõ ràng, nó là một khái niệm mới tự dưng xuất hiện, chưa từng có trước đây. Cách hiểu phổ biến nhất, đây là một "cách/quy trình phát triển và vận hành phần mềm". Được sinh ra từ việc khắc nhập 2 chữ: DEV elopment (phát triển) - OP eration S (vận hành). ### Quy trình phát triển phần mềm truyền thống Lập trình viên code, code xong chuyển qua cho SysAdmin cài đặt (deploy), QA sẽ tham gia kiểm tra chất lượng, nếu OK, SysAdmins sẽ mang đi deploy trên hệ thống chạy thật, nếu gặp lỗi / report bởi người dùng, SysAdmin sẽ chuyển lại cho devel...

In ra màn hình số 1 - dùng ngôn ngữ nào nhanh/nhẹ nhất?

Nếu chỉ cần in ra mà hình số 1, ngôn ngữ lập trình nào sẽ chạy tốn ít RAM nhất? Thí nghiệm sau sẽ cho ta thấy các chương trình cần bao nhiêu RAM để chạy và in ra số 1, kết thúc dòng bằng một dấu xuống dòng (newline \n ). Ta dùng chương trình /usr/bin/time để có cả thông số về RAM ( RSS ) thay vì chỉ gõ time - lệnh builtin của bash. bash4.3 $ /usr/bin/time bash -c 'echo 1' 1 0 .00user 0 .00system 0 :00.00elapsed 100 %CPU ( 0avgtext+0avgdata 3064maxresident ) k 0inputs+0outputs ( 0major+136minor ) pagefaults 0swaps dash $ /usr/bin/time /bin/dash -c 'echo 1' 1 0 .00user 0 .00system 0 :00.00elapsed ?%CPU ( 0avgtext+0avgdata 1492maxresident ) k 0inputs+0outputs ( 0major+67minor ) pagefaults 0swaps mawk $ /usr/bin/time mawk 'BEGIN {print 1}' 1 0 .00user 0 .00system 0 :00.00elapsed 100 %CPU ( 0avgtext+0avgdata 1932maxresident ) k 0inputs+0outputs ( 0major+86minor ) pagefaults 0swaps

bash exit status không là -1

Trong một đề tuyển dụng nào đó, có một yêu cầu là: script trả về exit status -1 nếu phát hiện lỗi. exit status của một câu lệnh / script / chương trình là một giá trị số được trả về khi chương trình kết thúc. Thông thường, chương trình trả về 0 tức là đã thành công, và khác 0 nghĩa là lỗi. Dùng bash, đơn giản ta sẽ gõ câu lệnh built-in trong bash: exit -1 $ echo "exit -1" > /tmp/test.sh $ bash /tmp/test.sh $ echo $? 255 Exit code ở đây là 255 chứ không phải -1. Thử với một giá trị khác: $ echo "exit 5" > /tmp/test5.sh $ bash /tmp/test5.sh $ echo $? 5

[Ebook] Tài liệu học lập trình miễn phí

 Tiêu chí: - Miễn phí - Chất - Nhóm theo ngôn ngữ. Bash 🤓 - LinuxCommand - ABS (Advanced Bash Scripting) Python 😘 - hướng dẫn Python Tiếng Việt - Tutorial - Dive into Python - The Hitchhiker’s Guide to Python! - Automate the Boring Stuff with Python - Invent Your Own Computer Games with Python - Hacking Secret Ciphers with Python - How to Think Like a Computer Scientist - SICP Python version - Learn Python the hard way - More ebooks:  http://pythonbooks.org/free-books/ Ruby 🙄 - Poignant Ruby - Learn Ruby the hard way   Haskell 😏 - Learn You a Haskell - Real world Haskell   C - Modern C

[Windows] PowerShell đã đến thế giới *NIX

PowerShell là gì?  PowerShell is an automation and configuration management platform. It consists of a cross-platform command-line shell and associated scripting language Trên các hệ điều hành giống UNIX (*NIX) có sh, bash , fish , zsh ... thì trên M$ xưa nay chỉ có "cmd" - một shell thuộc loại vô cùng đơn giản. Gần đây, M$ đã phát triển PowerShell với những cải tiến vượt trội so với "cmd" cổ cũ. Không biết "shell" là gì? xem thêm ở đây Sau vài chục năm ghét mãi không xong, M$ (Microsoft) đã quay sang bày tỏ tình yêu với Linux Các cụ dạy: "kẻ biết thời thế mới là anh hùng", các cụ đã dạy chắc là không sai. Đúng hay sai thì ai cũng thấy, M$ ngày càng được giới *NIX quan tâm hơn (ngay cả bài viết này), và người khổng lồ vẫn chưa ngã sau bao nhiêu sóng gió. Ai từ chối thay đổi, sẽ phải chết, hoặc sống dè dè 😁 Bạn muốn trở thành Linux Sysadmin? thử bấm vào đây Bạn muốn trở thành Windows Sysadmin? đóng 5 triệu rồi cũng bấm vào l...

[bash] Phím tắt hữu ích trên bash

Phím tắt thì rất nhiều, nhưng sau đây sẽ giới thiệu một số phím tắt quan trọng giúp tăng speed quẩy trên terminal lên max Các phím này đều là các phím tắt giống Emacs: Ctrl L (hay viết tắt là ^L)  - xoá mà hình, như gõ lệnh clear Ctrl U - xoá hết đằng trước cursor Ctrl K - xoá hết đằng sau cursor Ctrl W - xoá 1 từ đằng trước Ctrl A - di chuyển về đầu Ctrl E - di chuyển về cuối Ctrl R rồi gõ 1 từ khoá: tìm trong lịch sử câu lệnh đã chạy 1 câu lệnh nào đó (bấm Ctrl R tiếp để chọn các kết quả tìm kiếm khác  Ctrl H - xoá 1 ký tự đằng trước (như phím backspace) Ctrl F - di chuyển sang phải một ký tự (như phím right arrow - mũi tên sang phải) để đổi sang dùng như vi, có thể set file ~/.inputrc

[bash] trôi - in từng dòng của file theo phong cách slow-motion

Xin giới thiệu phát minh vĩ đại nhất của ngày hôm nay mang tên " trôi ", một câu lệnh siêu khủng khiếp có khả năng in ra từng dòng của một file - theo cơ chế quay chậm (slow-motion) : )) Ứng dụng: - xem cho đẹp, ngắm cho vui - auto scroll,  tự cuộn trang như boss Câu lệnh: $ alias troi='while read i; do echo $i; sleep 0.5; done <' $ troi /etc/passwd và rồi nói cứ thế trôi,  như suối trong khe,  như xe trên phố  trôi đi trôi đi như thế này này xe xe xe xe nước nước nước nước ...

[Python, bash] Kiểm tra file executable

Để kiểm tra xem đầu vào của nó có phải là một file chạy được không (như các file trong /bin , hay các file đã đươc chmod +x), hacker mũ hồng viết như sau: bash: $ test -x path python: In [3]: os.access(path, os.X_OK) Out[3]: True Có gì sai ở đây?

[algorithm] sleep sort

UPDATED : đã update phiên bản viết bằng golang ở cuối bài. Ngày hôm nay,  cộng đồng hackernews điên đảo vì một thuật toán sắp xếp được phát minh từ năm 2011 do một người ẩn danh đưa ra với tên gọi "sleep sort" . Nguyên văn implement trên bash như sau: #!/bin/bash function f () {     sleep "$1"     echo "$1" } while [ - n "$1" ] do     f "$1" &     shift done wait example usage: . /sleepsort.bash 5 3 6 3 6 3 1 4 7 Chỉ cần google là bạn sẽ tìm thấy nguồn, bài viết này sẽ không link đến trang mà thuật toán này được công bố, đơn giản vì không thích. Nếu lười gõ google, bạn có thể bấm vào đây .

[rabbitmq] ghi chú nhanh về user chạy rabbitmq

Bài viết sử dụng dẫn chứng trên: # lsb_release -d; dpkg -l rabbitmq* | grep rabbit Description:    Ubuntu 12.04.4 LTS ii  rabbitmq-server                  3.1.2-1                            AMQP server written in Erlang User chạy process rabbitmq luôn luôn là user ``rabbitmq``, cho dù bạn đã dùng user ``root`` để start service hoặc sử dụng câu lệnh ``rabbitmqctl` bằng ``root`` user. Lý do là vì các bin script do package rabbitmq cung cấp luôn kiểm tra user gọi câu lệnh và set nó về ``rabbitmq`` nếu có thể. Bằng chứng:

[bash] shell grammar (phần 1)

Theo quan sát của mình, hầu như mọi người học các ngôn ngữ lập trình đều theo cách rất cơ bản, học đầy đủ từ đầu đến cuối, sách này sách kia, nhưng với bash hầu hết người ta lại không học theo lối đó. Vì vậy có không ít điều rất đỗi bình thường của bash mà người dùng nhiều năm cũng không biết. Chuỗi bài viết này tổng hợp đầy đủ (hay ít nhất là theo man 1 bash là thế) về "cú pháp" "NGỮ PHÁP" trong bash. Bash gồm có: - câu lệnh đơn (simple command) - pipeline - list - các câu lệnh ghép (compound command) - coprocess - function definition 1. simple command là một câu lệnh bình thường, ví dụ: $ls -la $ rm -r /tmp/pigmovie 2>&1 > /dev/null TỪ KHOÁ: exit status : giá trị một chương trình / câu lệnh trả về khi chạy trong shell. Là một số nguyên, với giá trị 0 biểu diễn cho câu lệnh chạy thành công, các giá trị khác (có thể âm) biểu diễn một lỗi nào đó đã diễn ra. Bash lưu exit status của câu lệnh cuối cùng nó chạy ở biến $?, có thể echo ra để ...

[bash] shellshock - từ gốc đến ngọn

Shellshock là gì? shellshock là tên của lỗi bảo mật của phần mềm bash mới được phát hiện (tháng 9/2014) và hiện đang gây một cơn sốc trên Internet. Nó không phải sốc theo kiểu "cộng đồng mạng phát cuồng", hay "cộng đồng mạng bị sốc", mà là kiểu sốc "cộng đồng mạng" cơ bản là không tham gia vào :D Shellshock có nguy hiểm không? Cực kỳ nguy hiểm! cực kỳ là đến mức nào? Hãy google với từ khoá "shellshock dangerous" để tìm ra câu trả lời cho chính mình. Nói thẳng ra thì người dùng Windows không bị ảnh hưởng (trực tiếp), còn ai không biết thì chẳng thấy nguy hiểm gì. Giống như dịch Ebola, ai biết nó gây chết người trong vài ngày thì thấy sợ, ai không biết nó là cái gì thì làm sao mà thấy nó nguy hiểm?!!! Lỗi này có từ năm 1993 1989 [Thanks Le Manh Cuo ng ] và đến nay đã 25 năm từ khi nó ra đời, nhưng đến giờ mới được phát hiện. Hãy tưởng tượng trong 25 năm ấy, hacker có thể dễ dàng vào máy tính của bạn với quyền root (tức muốn làm gì thì ...

[shell] globbing (not regex)

1. Tên bài viết bằng tiếng Anh vì tác giả không thể tìm ra từ tiếng Việt nào cho phù hợp. 2. globbing không phải là regex matching. 3. bài này nhiều ký tự hoa mắt, xin hãy đọc từ từ, chỗ nào thấy sai thì comment ngay, nếu không globbing / regex mãi là một khái niệm mờ mịt. Bài viết thực hiện trên: ~ uname -sr Linux 3.13.0-32-generic Terminology (thuật ngữ) 1. globbing - globbing là toán tử expand một wildcard pattern thành danh sách các pathname match pattern đó. 1.1  wildcard pattern là các pattern có chứa ký tự wildcard (wildcard characters). 1.2 wildcard character

Popular posts from this blog

Tài liệu và hướng dẫn học Python

Để tiết kiệm thời gian, tốt nhất là đi học PyMI Updated: 130617 Sau đây là các tài liệu khuyên dùng: Vì nhiều lý do, nên học python2.7 tại thời điểm hiện tại (giờ là tháng 6/2013 - muốn biết tại sao thì tự tìm hiểu) python 3.5+ (giờ là tháng 2/2017) Chuẩn bị: 1. biết bật tắt máy 2. biết cài python 3. tập gõ 10 ngón - gõ 2 ngón hay 1 ngón cũng không sao, nhưng 10 ngón là cách dễ nhất để gõ nhanh nhất. Tài liệu - Nên dùng tài liệu tại trang chủ của Python làm chính, tham khảo thêm các tài liệu khác tại http://www.familug.org/2016/12/free-ebook.html Căn bản, mới học 1.1 Python PyMI.vn https://pymi.vn/tutorial/ 1.2. Python offical tutorial kết hợp làm bài tập trên HackerRank  (đề bài bằng tiếng Anh, nhưng Google translate 1 lúc cũng ra vì có nhiều ví dụ mẫu đi kèm). Học viên của Pymi.vn có rất nhiều học viên đã tự học với Learn Python the hard way nhưng chưa thấy ai thành công cả. Hai link dưới nên đọc sau khi đã nắm được những phần cơ bản của ngôn ngữ pytho...

The PyMiers

New FAMILUG