/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/
Showing posts with label Script. Show all posts
Showing posts with label Script. Show all posts

Basic Shell Script In Linux/Ubuntu/CentOS - P1

Trong windows chúng ta có batch file, trong linux có Shell Script. Nói chung shell là chương trình có thể tương tác người dùng, có thể input dữ liệu, có thể output ra màn hình, có thể tự động thực thi một nhóm lệnh do chúng ta tạo ra theo một lịch trình đã thiết lập.

1. Cách tạo và thực thi một chương trình shell

  • Tạo file hello.sh với nội dung:

#!/bin/bash
echo "hello world"

Giải thích: 
- #!/bin/bash: là shellbang, là dòng bắt buộc trong shell script
- echo "hello world": Khi chạy file hello.sh nó sẽ xuất ra màn hình chữ "hello world"

  • Thiết lập user có quyền (x) được phép thực thi cho file hello.sh
chmod u+x hello.sh


  • Chạy chương trình - file hello.sh vừa tạo

Có thể thực hiện 1 trong 3 cách như dưới
- sh hello.sh
- bash hello.sh
- ./hello.sh

Ví dụ: 

khanhvc@ubutu:~/projects/shell$ sh hello.sh
hello world


2. Shell variables

2.1 Biến của hệ thống: dùng lệnh printenv để in ra các biến đang tồn tại trong hệ thống linux

khanhvc@ubutu:~/projects/shell$ printenv
SHELL=/bin/bash
LC_ADDRESS=vi_VN
LC_NAME=vi_VN
LC_MONETARY=vi_VN
PWD=/home/khanhvc/projects/shell
LOGNAME=khanhvc
XDG_SESSION_TYPE=tty
MOTD_SHOWN=pam
HOME=/home/khanhvc
LC_PAPER=vi_VN
LANG=en_US.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
SSH_CONNECTION=192.168.0.48 63977 192.168.0.73 22
LESSCLOSE=/usr/bin/lesspipe %s %s
XDG_SESSION_CLASS=user
LC_IDENTIFICATION=vi_VN
TERM=xterm
LESSOPEN=| /usr/bin/lesspipe %s
USER=khanhvc
SHLVL=1
LC_TELEPHONE=vi_VN
LC_MEASUREMENT=vi_VN
XDG_SESSION_ID=330
XDG_RUNTIME_DIR=/run/user/1000
SSH_CLIENT=192.168.0.48 63977 22
LC_TIME=vi_VN
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
SSH_TTY=/dev/pts/0
LC_NUMERIC=vi_VN
OLDPWD=/home/khanhvc/projects
_=/usr/bin/printenv
khanhvc@ubutu:~/projects/shell$

Ví dụ: Tạo file demo.sh để in các thông tin các biến theo yêu cầu dưới:
  • Thông tin version của shell hiện tại
  • Tên của shell
  • Thư mục gốc của user hiện tại
  • Thông tin đường dẫn đã được thiết lập 
Nội dung file demo.sh
#!/bin/bash
echo $BASH_VERSION
echo $BASH
echo $HOME
echo $PATH

Kết quả:
khanhvc@ubutu:~/projects/shell$ ./demo.sh
5.0.17(1)-release
/bin/bash
/home/khanhvc
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
khanhvc@ubutu:~/projects/shell$


2.2 Biến do người dùng định nghĩa UDV - User Defined variables, biến CÓ phân biệt chữ hoa, chữ thường
  • Cú pháp:
ten_bien=gia_tri

2.2.1 EXPR
  • Ví dụ:
#!/bin/bash
a=6
b=3
expr $a + $b
Kết quả là: 9, vì nó lấy giá trị của a cộng cho giá trị của b

  • Ví dụ khác:
#!/usr/bin/bash
a=6
b=3

tong=$(expr $a + $b)
echo "Ket qua cua a CONG b = " $tong

hieu=$(expr $a - $b)
echo "Ket qua cua a TRU b = " $hieu

thuong=$(expr $a / $b)
echo "Ket qua cua a CHIA b = " $thuong

#phép nhân chúng ta phải thêm dấu "\" trước dấu "*" để thực hiện phép nhân
tich=$(expr $a \* $b)
echo "Ket qua cua a NHAN b = " $tich
Kết quả:
khanhvc@ubutu:~/projects/shell$ sh demo.sh
Ket qua cua a CONG b =  9
Ket qua cua a TRU b =  3
Ket qua cua a CHIA b =  2
Ket qua cua a NHAN b =  18
khanhvc@ubutu:~/projects/shell$

2.2.2 LET

  • Ví dụ 

#!/usr/bin/bash
a=6
let a+=1
echo "a = 6, a + 1 = " ${a}

let b=a+1
echo "b = a + 1 = " $b

let c=a+b
echo "c = a + b = " $c
  • Kết quả:
khanhvc@ubutu:~/projects/shell$ ./demo.sh
a = 6, a + 1 =  7
b = a + 1 =  8
c = a + b =  15
khanhvc@ubutu:~/projects/shell$


2.2.3 “bc” – An arbitrary precision calculator language”

  • Ví dụ: 

#!/usr/bin/bash
#in ra kết quả của 5 + 3
echo "5 + 3" | bc

#in ra kết quả là giá trị của x + y
x=10
y=20
echo "$x + $y" | bc

#in ra kết quả là giá trị của x + y
bc <<< "$x + $y"
  • Kết quả:
khanhvc@ubutu:~/projects/shell$ ./demo.sh
8
30
30
khanhvc@ubutu:~/projects/shell$

P/s: Kiểm tra câu lệnh chạy trong linux chúng ta dùng echo $? nếu kết quả số 0 thì câu lệnh kết thúc thành công, ngược lại là lỗi


Xong!

Windows, Forfiles - Tìm xóa và giữ lại các file theo thời gian chỉ định

Giới Thiệu: Forfiles của hệ điều hành windows giúp cho chúng ta chọn ra các file theo thời gian chỉ định nào đó và thực hiện các yêu cầu cho các file đã chọn.

Yêu cầu: Tìm và xóa tất cả các file PDF, chỉ giữ lại những file từ ngày 15 tháng 7 năm 2019

Gợi ý: Tạo file .cmd, .bat hoặc chạy trực tiếp file với code mẫu bên dưới
@echo off
set _Folder=98.SCAN
set _path=F:\Syno-FileServer\99.PUBLIC FOLDERs\%_Folder%
set _days=07/15/2019
forfiles /p "%_path%" /s /m *.pdf /D -%_days% /C "cmd /c del /q @path&echo @path >>%_path%\%_Folder%_DelFileList.txt"
@echo on

Giải thích:
thư mục cần tìm dữ liệu để xóa
set _Folder=98.SCAN
đường dẫn đến thư mục khai báo ở trên
set _path=F:\Syno-FileServer\99.PUBLIC FOLDERs\%_Folder%
Cài đặt biến ngày tháng năm. Định dạng mà máy thực hiện: tháng ngày năm. Ở đây chúng ta có thể số ngày cần giữ lại cũng được ví dụ như 15 ngày thì chổ _days=15
set _days=07/15/2019
Thực hiện tìm các file PDF (có thể thay bằng loại file khác hoặc xóa tất cả các file thì *.*) với thời gian cài đặt ở trên tiến hành xóa và lưu vào logfile các file đã xóa
forfiles /p "%_path%" /s /m *.pdf /D -%_days% /C "cmd /c del /q @path&echo @path" >>"%_path%\%_Folder%"_DelFileList.txt

Kết quả:


link tham khảo về Forfiles và forfile del log

Windows, Forfiles - Tìm xóa và giữ lại các file theo thời gian chỉ định

Giới Thiệu: Forfiles của hệ điều hành windows giúp cho chúng ta chọn ra các file theo thời gian chỉ định nào đó và thực hiện các yêu cầu cho các file đã chọn.

Yêu cầu: Tìm và xóa tất cả các file PDF, chỉ giữ lại những file từ ngày 15 tháng 7 năm 2019

Gợi ý: Tạo file .cmd, .bat hoặc chạy trực tiếp file với code mẫu bên dưới

Ping test và kết quả trả vào text

Yêu cầu: ping IP 8.8.8.8 và 8.8.4.4 kết quả ping trả về lưu vào file với tên theo cấu trúc ngày giờ hiện + tên máy tính đang ping + IP được ping.

Gợi ý: Tạo file .bat hoặc .cmd  với nội như bên dưới, sau đó chạy file vừa lưu.

@echo off
set _DateTime=%date%_%time%
set _DateTime=%_DateTime: =_%
set _DateTime=%_DateTime::=-%
set _DateTime=%_DateTime:/=_%
set _DateTime=%_DateTime:.=_%
set _hostname=%COMPUTERNAME%
set _output=%_DateTime%_%_hostname%
set _p1=8.8.8.8
set _p2=8.8.4.4
set _n=10
set _path=C:\tmp
ping -n %_n% %_p1% >%_path%\"%_output%_to_%_p1%.txt"
ping -n %_n% %_p2% >%_path%\"%_output%_to_%_p2%.txt"
@echo on



Giải thích:

Lấy ngày giờ hiện tại
set _DateTime=%date%_%time%
set _DateTime=%_DateTime: =_%
set _DateTime=%_DateTime::=-%
set _DateTime=%_DateTime:/=_%
set _DateTime=%_DateTime:.=_%

lấy tên máy tính đang thực hiện lệnh ping và nối với ngày giờ hiện tại
set _hostname=%COMPUTERNAME%
set _output=%_DateTime%_%_hostname%
IP cần ping
set _p1=8.8.8.8
set _p2=8.8.4.4
số lần lặp lại
set _n=10
nơi lưu kết quả ping
set _path=C:\tmp
thực hiện lệnh ping và đẩy kết quả vào file
ping -n %_n% %_p1% >%_path%\"%_output%_to_%_p1%.txt"
ping -n %_n% %_p2% >%_path%\"%_output%_to_%_p2%.txt"

Kết quả:

Ping test và kết quả trả vào text

Yêu cầu: ping IP 8.8.8.8 và 8.8.4.4 kết quả ping trả về lưu vào file với tên theo cấu trúc ngày giờ hiện + tên máy tính đang ping + IP được ping.

Gợi ý: Tạo file .bat hoặc .cmd  với nội như bên dưới, sau đó chạy file vừa lưu.

@echo off
set _DateTime=%date%_%time%
set _DateTime=%_DateTime: =_%
set _DateTime=%_DateTime::=-%
set _DateTime=%_DateTime:/=_%
set _DateTime=%_DateTime:.=_%
set _hostname=%COMPUTERNAME%
set _output=%_DateTime%_%_hostname%
set _p1=8.8.8.8
set _p2=8.8.4.4
set _n=10
set _path=C:\tmp
ping -n %_n% %_p1% >%_path%\"%_output%_to_%_p1%.txt"
ping -n %_n% %_p2% >%_path%\"%_output%_to_%_p2%.txt"
@echo on



Giải thích:

Lấy ngày giờ hiện tại
set _DateTime=%date%_%time%
set _DateTime=%_DateTime: =_%
set _DateTime=%_DateTime::=-%
set _DateTime=%_DateTime:/=_%
set _DateTime=%_DateTime:.=_%

lấy tên máy tính đang thực hiện lệnh ping và nối với ngày giờ hiện tại
set _hostname=%COMPUTERNAME%
set _output=%_DateTime%_%_hostname%
IP cần ping
set _p1=8.8.8.8
set _p2=8.8.4.4
số lần lặp lại
set _n=10
nơi lưu kết quả ping
set _path=C:\tmp
thực hiện lệnh ping và đẩy kết quả vào file
ping -n %_n% %_p1% >%_path%\"%_output%_to_%_p1%.txt"
ping -n %_n% %_p2% >%_path%\"%_output%_to_%_p2%.txt"

Kết quả:

Lấy ngày giờ hệ trên Windows bằng CLI

Giới thiệu: Đôi khi chúng ta cần lấy ngày giờ hiện tại để thêm vào các script nhằm mục đích mà chúng ta muốn. Ví dụ như backup và đặt tên file theo ngày giờ hiện tại, ping đẩy kết quả ping vào file text,... nói chung là nhiều thứ trên đời. Hôm nay ta khởi đầu với bài lấy ngày giờ hiện tại của máy tính hiện tại đưa vào biến.

Yêu cầu: Lấy ngày giờ hiện tại và thay:
  • " " (dấu cách) thành "_"
  • ":" (dấu 2 chấm) thành "-"
  • "/" (dấu sẹt sắc) thành "-"
  • "." (dấu 1 chấm) thành "_" và đưa ngày tháng năm vào biến sau đó in ra màn hình để test.
Code mẫu
@echo off
set _DateTime=%date%%time%
set _DateTime=%_DateTime: =_%
set _DateTime=%_DateTime::=-%
set _DateTime=%_DateTime:/=-%
set _DateTime=%_DateTime:.=_%
set _DateTime=%_DateTime:~4,10%
Echo  %_DateTime%
@echo on

Giải thích: 

C:\Users\Admin>@echo off
set _DateTime=%date%%time%
in ra kết quả ban đầu chưa thực hiện thay thế theo yêu cầu đề bài
Echo %_DateTime%
Wed 08/07/2019 9:42:33.05
set _DateTime=%_DateTime: =_%
set _DateTime=%_DateTime::=-%
set _DateTime=%_DateTime:/=-%
set _DateTime=%_DateTime:.=_%

in ra kết quả sau khi đã thực hiện thay thế theo yêu cầu đề bài
Echo %_DateTime%
Wed_08-07-2019_9-42-33_05
set _DateTime=%_DateTime:~4,10%
thực hiện lấy bắt đầu từ vị trí thứ 4lấy 10 ký tự trong biến ngày giờ
in kết quả ra màn hình

Echo %_DateTime%
08-07-2019

Xong!

Lấy ngày giờ hệ trên Windows bằng CLI

Giới thiệu: Đôi khi chúng ta cần lấy ngày giờ hiện tại để thêm vào các script nhằm mục đích mà chúng ta muốn. Ví dụ như backup và đặt tên file theo ngày giờ hiện tại, ping đẩy kết quả ping vào file text,... nói chung là nhiều thứ trên đời. Hôm nay ta khởi đầu với bài lấy ngày giờ hiện tại của máy tính hiện tại đưa vào biến.

Yêu cầu: Lấy ngày giờ hiện tại và thay:
  • " " (dấu cách) thành "_"
  • ":" (dấu 2 chấm) thành "-"
  • "/" (dấu sẹt sắc) thành "-"
  • "." (dấu 1 chấm) thành "_" và đưa ngày tháng năm vào biến sau đó in ra màn hình để test.

Reset Permission Folder On Windows

Giới thiệu: Vì lý do gì đó mà forlder trong windows có permission không như chúng ta mong muốn, chúng ta reset về mặt định rồi làm lại theo ý mình, tuy nhiên với GUI thao tác nhiều mất công có khi lại lâu nữa và nếu dữ liệu quá nhiều việc thực hiện sẽ mất khá nhiều thời gian, có khi không thể thực hiện trong giờ làm việc được vì sẽ ảnh hưởng đến tốc độ truy của người khác trên FileServer. Là những IT lười biếng nên dùng CLI thay cho GUI và có thể lập lịch định thời gian cho máy tính tự làm.

Yêu cầu:
Reset folder C:\VIDU về mặt định và thêm Everyone full control và áp xuống tất các thư mục bên trong

Code mẫu
@echo off
set _path="C:\VIDU"
REM take ownership and reset permissions
TAKEOWN /f %_path% /r /d y
ICACLS %_path% /reset /T
REM grant full control to administrators
ICACLS %_path% /grant:r "BUILTIN\ADMINISTRATORS":(OI)(CI)F
ICACLS %_path% /grant:r "Users":(OI)(CI)F
ICACLS %_path% /grant:r "Creator owner":(OI)(CI)F
ICACLS %_path% /grant:r "System":(OI)(CI)F
ICACLS %_path% /grant:r "Everyone":(OI)(CI)F
REM set inheritance on everything below
ICACLS %_path% /inheritance:r
@echo on

Gợi ý hướng giải quyết.
1. Chạy cmd Runas quyền Administrator sau đó dán đoạn code bên trên vào màn hình command line.
2. Tạo file có đuôi .bat, .cmd sau đó lập lịch để Windows tự làm theo lịch đã định.



Reset Permission Folder On Windows

Giới thiệu: Vì lý do gì đó mà forlder trong windows có permission không như chúng ta mong muốn, chúng ta reset về mặt định rồi làm lại theo ý mình, tuy nhiên với GUI thao tác nhiều mất công có khi lại lâu nữa và nếu dữ liệu quá nhiều việc thực hiện sẽ mất khá nhiều thời gian, có khi không thể thực hiện trong giờ làm việc được vì sẽ ảnh hưởng đến tốc độ truy của người khác trên FileServer. Là những IT lười biếng nên dùng CLI thay cho GUI và có thể lập lịch định thời gian cho máy tính tự làm.

Yêu cầu:
Reset folder C:\VIDU về mặt định và thêm Everyone full control và áp xuống tất các thư mục bên trong

/*header slide*/