路徑的意義 20250821
./ 代表 目前所在的目錄
../ 代表 上一層目錄
/ 代表 根目錄
vi 共分為三種模式,分別是『一般模式』、『編輯模式』與『指令列命令模式』三種
使用 vi 進入一般模式
按下 i 進入編輯模式,開始編輯文字。
按下 [Esc] 按鈕回到一般模式。
在一般模式中按下 :wq 儲存後離開 vi。
常用指令列表
h 或向左方向鍵 游標向左移動一個字元
j 或向下方向鍵 游標向下移動一個字元
k 或向上方向鍵 游標向上移動一個字元
l 或向右方向鍵 游標向右移動一個字元
+ 游標移動到非空白字元的下一行
- 游標移動到非空白字元的上一行
n<space> [lt]按下數字後再按空白鍵,游標會向右移動這一行的 n 個字元。
例如 20<space> 則游標會向後面移動 20 個字元距離。
0 這是數字『 0 』:移動到這一行的最前面字元處。
$ 移動到這一行的最後面字元處
H 游標移動到這個螢幕的最上方那一行
M 游標移動到這個螢幕的中央那一行
L 游標移動到這個螢幕的最下方那一行
G 游標移動到這個檔案的最後一行
nG [lt]游標移動到這個檔案的第n行。
例如 20G 則會移動到檔案的第20行(可配合:set nu)
n<Enter> 游標向下移動n行
一般模式 搜尋與取代
/word 向游標之後尋找一個字串名稱為 word 的字串。
?word 向游標之前尋找一個字串名稱為 word 的字串。
n 重複前一個搜尋。
N 反向進行前一個搜尋動作。
:n1,n2s/word1/word2/g 在第 n1 與 n2 行之間尋找 word1 這個字串,並將該字串取代為 word2 。
:1,$s/word1/word2/g 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 。
:1,$s/word1/word2/gc 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 且在取代前顯示提示字元給使用者確認是否需要取代。
一般模式 刪除、複製與貼上
x, X x 為向後刪除一個字元,X 為向前刪除一個字元
nx 向後刪除 n 個字元
dd 刪除游標所在的那一整行
ndd 刪除游標所在的向下 n 行,例如 20dd 則是刪除 20 行
d1G 刪除游標所在到第一行的所有資料
dG 刪除游標所在到最後一行的所有資料
dw 刪除一個字(delete word)。不適用於中文。
yy 複製游標所在的那一行(常用)
nyy 複製游標所在的向下 n 行,例如 20yy 則是複製 20 行
y1G 複製游標所在行到第一行的所有資料
yG 複製游標所在行到最後一行的所有資料
p, P p 為複製的資料在游標下一行貼上,P 則為貼在游標上一行。
J 將游標所在行與下一行的資料結合成同一行
u 復原前一個動作。
進入編輯模式
i, I 插入:i(I) 在目前的游標所在處(所在行第一個非空白字元處)插入輸入之文字;
a, A 增加:a(A) 由目前游標所在的下一個(最後一個)字元處開始輸入:
o, O 插入新的一行:o(O) 從游標所在的下(上)一行插入新的一行;
r, R 取代:r 會取代游標所在的那一個字元;R 會一直取代游標所在的文字,直到按下 ESC 為止;
Esc 退出編輯模式,回到一般模式中。
指令列命令模式
:w 將編輯的資料寫入硬碟檔案中
:w! 若檔案屬性為『唯讀』時,強制寫入該檔案
:q 離開 vi
:q! 若曾修改過檔案,又不想儲存,使用 ! 為強制離開不儲存檔案。
:wq 儲存後離開,若為 :wq! 則為強制儲存後離開
:x 與 wq 相同
:e! 將檔案還原到最原始的狀態。
ZZ 若檔案沒有更動,則不儲存離開,若檔案已經經過更動,則儲存後離開。
:w [filename] 將編輯的資料儲存成另一個檔案(類似另存新檔)
:r [filename] 在編輯的資料中,讀入另一個檔案的資料。亦即將 『filename』 這個檔案內容加到游標所在行後面。
:set nu 顯示行號,設定之後,會在每一行的字首顯示該行的行號
:set nonu 與 set nu 相反,為取消行號。
:n1,n2 w [filename] 將 n1 到 n2 的內容儲存成 filename 這個檔案。
:! command 暫時離開 vi 到指令列模式下執行 command 的顯示結果。例如[ :! ls /home ]
設定 Linux 使用 SSH Key-based 登入驗證方式 出處
------------------------------
試用兩三天發現,若是你的帳號並不完全出現
permission denied (publickey)
解決方法:可能是你的user有問題 出處
新一個user或是刪除重新再建也可以。
-----------------------------
每個使用者都有自己的.ssh帶有身份驗證金鑰的資料夾。但是,您可以透過轉到第一台伺服器並鍵入命令來實現
ssh-copy-id root@server-you-need-to-connect-to.com
輸入您的密碼一次。
您的密鑰現在已複製給該用戶。
對您需要連線的其他使用者重複此操作,例如$ ssh-copy-id user@server.com
在常駐模式(daemon mode)下,rsync server 預設監聽TCP埠873
Rsync在備份時,主要是傳送資料差異的部份,因此大多都被使用在差異備份上。除了資料第一次傳輸是整份檔案外,之後都只會傳送資料間異動的部份。
名詞解釋
備份伺服器: 有執行 rsync 服務的伺服器,等待其它客戶端將檔案傳輸過來做備份。
用戶端: 在本地端執行 /usr/bin/rsync,將檔案傳到遠端的「備份伺服器」做備份。
備份伺服器
/etc/rsyncd.conf #為rsync設定檔
/etc/rsyncd.secrets #為rsync 密碼檔
伺服器端設定
nano /etc/rsyncd.conf -->新增檔案
#模組名稱
[Rsync]
#說明
comment = backup test
#允許使用rsync連入的ip
hosts allow = 172.16.10.9
#不允許連入的ip,*表示全檔
hosts deny = *
#存放備份資料的目錄
path = /srv/dev-disk-by-label-data/Rsync
#認證帳號 (要設定於rsyncd.secrets 內的帳號)
auth users = root
#用來啟動rsync server 的uid
uid = root
#用來啟動rsync server 的gid
gid = root
#密碼檔存放路徑
secrets file = /etc/rsyncd.secrets
#是否設定為唯讀
read only = no
#不要對這些附檔名的檔案做壓縮
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
nano /etc/rsyncd.secrets -->新增檔案
#設定格式=> 帳號:密碼
root:password
#必須修改rsyncd.secrets使用權限 (很重要)
chmod 600 /etc/rsyncd.secrets
chown root.root /etc/rsyncd.secrets
service rsync restart
測試看看是否都正常 (rsync的port為873)
netstat -tnlp | grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4235/xinetd
telnet localhost 873
#若出現下列訊息表示正常
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
@RSYNCD: 29
Client端設定
在Client主機上只需要設定密碼就可以。
nano /etc/rsyncd.secrets
#設定格式: 密碼
password
#修改rsyncd.secrets使用權限 (很重要)
chmod 600 /etc/rsyncd.secrets
chown root.root /etc/rsyncd.secrets
-----20240801 update----------
安裝
apt-get install rsync
啟動
修改 /etc/init.d/rsync
RSYNC_ENABLE= true #改成 true
啟動rsync伺服器
sudo service rsync start
參考 https://josephjsf2.github.io/ 網頁
修改 /etc/rsyncd.conf
uid = 0
gid = 0
# 執行rsync 前會執行chroot指令到 "path" 路徑下
use chroot = yes
# 最大同時連線數
max connections = 4
# log 記錄位置
log file=/root/rsyncd.log
# rsync pid檔案路徑
pid file = /var/run/rsyncd.pid
# 同步時排除的檔案
exclude = lost+found/
# 傳輸過程式否要輸出log
transfer logging = yes
# 連線逾時時間,單位為秒
timeout = 900
# 忽略沒有讀取權限檔案
ignore nonreadable = yes
# 指定之檔案不再壓縮傳輸
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
[SharedFolder]
# 表示uid 會是登入者,如果這邊沒有設定uid資訊,則會套用到上方 0
uid = %RSYNC_USER_NAME%
# 該組設定的目錄路徑
path = /home/bake/SharedFolder
# 說明
comment = Shared Folder
# 是否read only
read only = no
# 允許連線的帳號,必須存在於linux 系統內
auth users = bake
#紀錄帳號密碼的檔案位置
secrets file = /home/bake/rsync/rsync.secret
# 記錄log 位置
log file = /home/bake/rsync/log/rsync.log
指令
rsync -arvzh joseph@SERVER_IP_ADDRESS::SharedFolder /home/joseph/SharedFolder/ --password-file=/rsync/SharedFolder.passwd --delete
ntpdate tock.stdtime.gov.tw
網路對時 20240719
crontab -e 設定排程
0 12 * * * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc
#分 時 日 月 週 |<==============指令串========================>| 20240719
sell 錯誤處理
cat /etc/passwd
取得 /etc/passwd檔案的內容
type 指令
此指令是否為內建
echo ${變數名稱}
列印出變數的值
name="變數值"
設定變數name值為設定的變數值
export 變數
匯入變數
locale
查閱系統的語言
read
讀取鍵盤輸入的變數
export
自訂變數轉成環境變數
declare/tpyeset
宣告變數的類型
array
陣列 var[index]=content
ex: var[1]="small min"
var[2]="big min"
var[3]="nice min"
history
查閱已下令的歷史指令
&&
cmd1 && cmd2 1. 若cmd1執行完畢且正確($?=0),則開始執行cmd2
2.若cmd1執行完畢且為錯誤($?≠0),則cmd2不執行
||
cmd1 && cmd2 1. 若cmd1執行完畢且正確($?=0),則不執行cmd2
2.若cmd1執行完畢且為錯誤($?≠0),則開始執行cmd2
| (pipe)
把 STDOUT用STDIN給下一個指令使用
echo ${PATH} | cut -d ':' -f 3 =>echo PATH的環境變數,取得:的第3段
cut cut -d'分隔字元' -f fields
grep grep [-acinv] [--color=auto] '搜尋字串' filename
擷取命令
sort sort [-fbMnrtuk] [file or stdin]
排序
cat /etc/passwd | sort 個人帳號都記錄在 /etc/passwd 下,請將帳號進行排序。
uniq uniq [-ic]
將重複的資料僅列出一個顯示
cat cut -d'分隔字元' -f fields
出現上述錯誤
原因:
找了一下原因,原來是因為 sh的語法並沒有 "==" 這種語法,而是必須使用單一個"="
而"=="這語法,是bash在使用的
因此解決方法:
把語法 "==" 改為 "="