天天看點

Ubuntu 常用指令PrefaceSSH相關别名alias簡化指令切換使用者防火牆使用者與使用者組相關遞歸下載下傳抓取整個網站内容跟蹤日志輸出統計檔案夾大小壓縮和解壓縮目錄操作指令查找相關

原文連結: http://yangbingdong.com/2017/note-of-linux-command/

Preface

=.= 這裡隻記錄一些個人比較常用到的 Ubuntu

指令

那些太基本以及太高深的就......

SSH相關

保持長連接配接

隻需要在

ssh

指令後加上發送心跳即可:

ssh -o ServerAliveInterval=30 [email protected] -p 2333
           

生成SSH密鑰和公鑰

打開終端,使用下面的

ssh-keygen

來生成

RSA

密鑰和公鑰。

-t

表示type,就是說要生成

RSA

加密的鑰匙:

ssh-keygen -t rsa -C "[email protected]"
           

RSA

也是預設的加密類型,是以你也可以隻輸入

ssh-keygen

,預設的

RSA

長度是2048位,如果你非常注重安全,那麼可以指定4096位的長度:

ssh-keygen -b 4096 -t rsa -C "[email protected]"
           

生成SSH Key的過程中會要求你指定一個檔案來儲存密鑰,按

Enter

鍵使用預設的檔案就行了,然後需要輸入一個密碼來加密你的SSH Key,密碼至少要20位長度,SSH密鑰會儲存在

home

目錄下的

.ssh/id_rsa

檔案中,SSH公鑰儲存在

.ssh/id_rsa.pub

檔案中。

Generating public/private rsa key pair.
Enter file in which to save the key (/home/matrix/.ssh/id_rsa):  #按Enter鍵
Enter passphrase (empty for no passphrase):   #輸入一個密碼
Enter same passphrase again:   #再次輸入密碼
Your identification has been saved in /home/matrix/.ssh/id_rsa.
Your public key has been saved in /home/matrix/.ssh/id_rsa.pub.
The key fingerprint is:
e1:dc:ab:ae:b6:19:b0:19:74:d5:fe:57:3f:32:b4:d0 matrix@vivid
The key's randomart image is:
+---[RSA 4096]----+
| .. |
| . . |
| . . .. . |
| . . o o.. E .|
| o S ..o ...|
| = ..+...|
| o . . .o .|
| .o . |
| .++o |
+-----------------+
           

檔案傳輸

姿勢:

# 傳輸單個檔案
scp -P <端口> <源檔案> <目标檔案>

# 傳輸檔案夾
scp -P <端口> -r <源檔案夾> <目标檔案夾>
           

注意

-P

要在前面

ex:

scp -P 2333 /home/ybd/file [email protected]:/root/file
           

免密碼登入遠端伺服器

姿勢一

使用上述

scp

把公鑰上傳到伺服器,然後:

cat id_rsa.pub >> ~/.ssh/authorized_keys
           

姿勢二

可以使用

ssh-copy-id

指令來完成:

ssh-copy-id <使用者名>@<伺服器ip> -p <端口>
           

輸入遠端使用者的密碼後,SSH公鑰就會自動上傳了,SSH公鑰儲存在遠端Linux伺服器的

.ssh/authorized_keys

别名alias簡化指令

隻需要在目前使用者目錄加上别名指令,但部落客用的是

zsh

,所有配置在

.zshrc

而不是

.bashrc

echo "alias vps='ssh -o ServerAliveInterval=30 [email protected] -p 2333'" >> ~/.zshrc
source ~/.zshrc
           

然後直接輸入

vps

就可以登陸遠端伺服器了。

切換使用者

使用

su

指令切換使用者,ex:

su - ybd
           

這樣就切換到了ybd使用者

su -

就是

su -l

(l為login的意思),

l

可以省略,是以一般寫成

su -

.....(坑爹)

如果不加使用者名,預設是

su root

切換

root

使用者。

注意:

su

su -

的差別

  • 前者是直接切換,還保留了目前位置以及變量
  • 而後者不單單切換了使用者,而且還切換到了使用者目錄,并且之前使用者的環境變量沒有了!
因為這個原因,寫

Dockerfile

困擾了好一段時間...囧

還有

su

也可以使用某個使用者的身份執行一些指令,ex:

# 執行單個指令
su - ${USER_NAME} -c "npm install -g hexo-cli"
# 執行shell腳本
su - ${USER_NAME} -s /bin/bash shell.sh
           

執行完之後還是保持目前使用者。

可以通過

exit

退出目前使用者。

防火牆

1、檢視端口是否開啟:

telnet 192.168.1.103 80
           

2、檢視本地的端口開啟情況:

sudo ufw status
           

3、打開80端口:

sudo ufw allow 80
           

4、防火牆開啟:

sudo ufw enable
           

5、防火牆重新開機:

sudo ufw reload
           

使用者與使用者組相關

添加使用者useradd

建立

ybd

使用者并且加入

ybd

使用者組并且建立使用者目錄:

useradd -g ybd -m ybd
# 或者
user add -m -U ybd
           

修改密碼

passwd ybd
           

修改使用者usermod

添加使用者組groupadd

修改使用者組

ex:将test組的名子改成test2

groupmod -n test2 test
           

删除組test2

groupdel test2
           

檢視組

檢視目前登入使用者所在的組:

groups
           

檢視使用者test所在組:

groups test
           

檢視所有組:

cat /etc/group
           

修改使用者名

usermod

不允許你改變正線上上的使用者帳号名稱。當

usermod

用來改變

userID

,必須确認這名

user

沒在電腦上執行任何程式,否則會報“

usermod: user xxx is currently logged in

”錯誤。是以必須

root

使用者登入或者其他使用者登入然後切換到

root

身份,而不能在目前使用者下切換至

root

進行修改。

1、以root身份登入

2、usermod -l hadoop seed

該指令相當于做了兩件事:

  • /etc/passwd

    下的使用者名欄從

    seed

    修改為

    hadoop

    ,其他部分不變
  • /etc/shadow

    seed

    hadoop

3、usermod -c hadoop hadoop

  • 相當于将

    /etc/passwd

    下的注解欄修改為

    hadoop

4、groupmod -n hadoop seed

  • 将原來的使用者組

    seed

    hadoop

    ,隻修改組名,組辨別号不變,相當于修改了檔案

    /etc/group

    /etc/gshadow

5、usermod -md /home/hadoop hadoop

相當于做了兩件事:

  • 将~下的登入目錄欄修改為

    /home/hadoop

  • 将原來的使用者目錄

    /home/seed

    修改為新的使用者目錄

    /home/hadoop

遞歸下載下傳抓取整個網站内容

wget -r -p -k -np <URL>
           

參數說明:

-r

: 遞歸下載下傳

-p

: 下載下傳所有用于顯示 HTML 頁面的圖檔之類的元素

-k

: 在轉換檔案 X 前先将它備份為

X.orig

-np

: 不追溯至父目錄

跟蹤日志輸出

tail -f <log>

# 輸出最後1000行
tail -1000 <log>
           

統計檔案夾大小

du -hs `ls -al |awk '{print $9}'`
           

上面指令可以統計檔案夾中所有的檔案夾和檔案的大小,并且包括隐藏目錄。缺點是連上級目錄也會統計。

如果不需要列出上級目錄,則把ls指令的-a換成-A,就不會列出點檔案了。

du -hs `ls -Al |awk '{print $9}'`
           

如果不需要列出檔案,隻需檔案夾,則在ls中增加-d參數即可

du -hs `ls -Adl |awk '{print $9}'`
或
du -hs `ls -Al |grep ^d|awk '{print $9}'`
           

壓縮和解壓縮

打包但是不壓縮(

tar

):

tar -cf <壓縮封包件名> <要打包的目錄>

打包并壓縮(

tar.gz

tar -zcf <壓縮封包件名> <要打包的目錄>

解壓縮

tar

檔案:

tar -xvf <壓縮封包件>

tar.gz

tar -zxvf <壓縮封包件>

目錄操作指令

在Windows系統中,有

C

D

E

等衆多的盤符,每個盤符就是一個根目錄。在

Linux

Unix

MacOS

等系統的檔案系統中,隻有一個根目錄,那就是

root

,以一個斜杠代表(

/

)。

切換目錄:

cd

該指令和Windows中沒有太大的差別,都表示改變目前的工作目錄。

cd <目标目錄>
           

顯示目前目錄:

pwd

顯示目前目錄的路徑,傳回字元串。在Windows使用cd不帶參數的方式代替。該指令同樣也沒有參數。

周遊目錄:

ls

顯示目前目錄中的内容,常用的指令有:

以清單顯示目前目錄所有的目錄和檔案
ls -l
           

Linux

Unix

MacOS

等系統中,隐藏檔案均是點(.)開頭的,下面指令以清單顯示目前目錄所有的目錄和檔案,包括隐藏的目錄和檔案。

ls -al
           

顯示所有的目錄,包括隐藏的目錄,但是不包括檔案

ls -adl
           

複制:

cp

cp

copy

的簡稱,用于複制檔案和目錄。複制的時候,源路徑和目錄路徑可以是一個檔案,也可以是一個目錄。

cp <源路徑> <目标路徑>
           

移動:

mv

mv

是移動(

move

)的簡稱,用于移動檔案和目錄。

mv  <源路徑> <目标路徑>
           

删除:

rm

rm

指令可以用于删除目錄和檔案,但是通過

rm

删除目錄的話,必須加上

rm -rf <目錄名稱>

删除檔案直接就是

rm <檔案名>

在

Linux

或者

Unix

系統中,通過

rm

或者檔案管理器删除檔案将會從檔案系統的目錄結構上解除連結(

unlink

).

然而如果檔案是被打開的(有一個程序正在使用),那麼程序将仍然可以讀取該檔案,磁盤空間也一直被占用。

可以通過

lsof

指令檢視檔案是否被打開。詳見 列出打開的檔案。

删除目錄:rmdir

删除目錄的時候,必須確定目錄是空的,否則無法删除。指令格式:

rm <目錄>

查找相關

以下轉載于 http://blog.csdn.net/wzzfeitian/article/details/40985549

find指令

find < path > < expression > < cmd >

  • path: 所要搜尋的目錄及其所有子目錄。預設為目前目錄。
  • expression: 所要搜尋的檔案的特征。
  • cmd: 對搜尋結果進行特定的處理。

如果什麼參數也不加,find預設搜尋目前目錄及其子目錄,并且不過濾任何結果(也就是傳回所有檔案),将它們全都顯示在螢幕上。

find指令常用選項及執行個體

-name

按照檔案名查找檔案。

find /dir -name filename  在/dir目錄及其子目錄下面查找名字為filename的檔案
find . -name "*.c" 在目前目錄及其子目錄(用“.”表示)中查找任何擴充名為“c”的檔案
           

-perm

按照檔案權限來查找檔案。

find . -perm 755 –print 在目前目錄下查找檔案權限位為755的檔案,即檔案屬主可以讀、寫、執行,其他使用者可以讀、執行的檔案
           

-prune

使用這一選項可以使

find

指令不在目前指定的目錄中查找,如果同時使用

-depth

選項,那麼

-prune

将被

find

指令忽略。

find /apps -path "/apps/bin" -prune -o –print 在/apps目錄下查找檔案,但不希望在/apps/bin目錄下查找
find /usr/sam -path "/usr/sam/dir1" -prune -o –print 在/usr/sam目錄下查找不在dir1子目錄之内的所有檔案
           

-depth

:在查找檔案時,首先查找目前目錄中的檔案,然後再在其子目錄中查找。

find / -name "CON.FILE" -depth –print 它将首先比對所有的檔案然後再進入子目錄中查找
           

-user

按照檔案屬主來查找檔案。

find ~ -user sam –print 在$HOME目錄中查找檔案屬主為sam的檔案
           

-group

按照檔案所屬的組來查找檔案。

find /apps -group gem –print 在/apps目錄下查找屬于gem使用者組的檔案

           

-mtime -n +n

按照檔案的更改時間來查找檔案, -n表示檔案更改時間距現在n天以内,+n表示檔案更改時間距現在n天以前。

find / -mtime -5 –print 在系統根目錄下查找更改時間在5日以内的檔案
find /var/adm -mtime +3 –print 在/var/adm目錄下查找更改時間在3日以前的檔案
           

-nogroup

查找無有效所屬組的檔案,即該檔案所屬的組在

/etc/groups

中不存在。

find / –nogroup -print
           

-nouser

查找無有效屬主的檔案,即該檔案的屬主在

/etc/passwd

find /home -nouser –print
           

-newer file1 ! file2

查找更改時間比檔案file1新但比檔案file2舊的檔案。

-type

查找某一類型的檔案,

諸如:

  • b - 塊裝置檔案。
  • d - 目錄。
  • c - 字元裝置檔案。
  • p - 管道檔案。
  • l - 符号連結檔案。
  • f - 普通檔案。
find /etc -type d –print 在/etc目錄下查找所有的目錄
find . ! -type d –print 在目前目錄下查找除目錄以外的所有類型的檔案
find /etc -type l –print 在/etc目錄下查找所有的符号連結檔案
           

-size n[c]

查找檔案長度為n塊的檔案,帶有c時表示檔案長度以位元組計。

find . -size +1000000c –print 在目前目錄下查找檔案長度大于1 M位元組的檔案
find /home/apache -size 100c –print 在/home/apache目錄下查找檔案長度恰好為100位元組的檔案
find . -size +10 –print 在目前目錄下查找長度超過10塊的檔案(一塊等于512位元組)
           

-mount

在查找檔案時不跨越檔案系統mount點。

find . -name “*.XC” -mount –print

從目前目錄開始查找位于本檔案系統中檔案名以XC結尾的檔案(不進入其他檔案系統)

-follow

如果find指令遇到符号連結檔案,就跟蹤至連結所指向的檔案

-exec

find指令對比對的檔案執行該參數所給出的shell指令。相應指令的形式為

command {} \

,注意

{}

\

;之間的空格

$ find ./ -size 0 -exec rm {} \; 删除檔案大小為零的檔案
$ rm -i `find ./ -size 0`  
$ find ./ -size 0 | xargs rm -f &

為了用ls -l指令列出所比對到的檔案,可以把ls -l指令放在find指令的-exec選項中:
$ find . -type f -exec ls -l {} \;
在/logs目錄中查找更改時間在5日以前的檔案并删除它們:
find /logs -type f -mtime +5 -exec rm {} \;
           

-ok

,和

-exec

的作用相同,隻不過以一種更為安全的模式來執行該參數所給出的shell指令,在執行每一個指令之前,都會給出提示,讓使用者來确定是否執行。

find . -name "*.conf"  -mtime +5 -ok rm {} \; 在目前目錄中查找所有檔案名以.LOG結尾、更改時間在5日以上的檔案,并删除它們,隻不過在删除之前先給出提示
           

說明: 如果你要尋找一個檔案的話,那麼使用 find 會是一個不錯的主意。不過,由于 find 在尋找資料的時候相當的耗硬碟,是以沒事情不要使用 find 啦!有更棒的指令可以取代呦,那就是

whereis

locate

咯~

一些常用指令

1. find . -type f -exec ls -l {} \;
查找目前路徑下的所有普通檔案,并把它們列出來。

2. find logs -type f -mtime +5 -exec rm {} \;
删除logs目錄下更新時間為5日以上的檔案。

3.find . -name "*.log" -mtime +5 -ok rm {} \;
删除目前路徑下以。log結尾的五日以上的檔案,删除之前要确認。

4. find ~ -type f -perm 4755 -print
查找$HOME目錄下suid位被設定,檔案屬性為755的檔案列印出來。
說明: find在有點系統中會一次性得到将比對到的檔案都傳給exec,但是有的系統對exec的指令長度做限制,就會報:”參數列太長“,這就需要使用xargs。xargs是部分取傳來的檔案。

5. find / -type f -print |xargs file
xargs測試檔案分類

6. find . -name "core*" -print|xargs echo " ">/tmp/core.log
将core檔案資訊查詢結果報存到core。log日志。

7. find / -type f -print | xargs chmod o -w

8. find . -name * -print |xargs grep "DBO"
           

grep指令

grep [選項] pattern [檔案名]
           

指令中的選項為:

  • -? 同時顯示比對行上下的?行,如:

    grep -2 pattern filename

    同時顯示比對行的上下2行。
  • -b,—byte-offset 列印比對行前面列印該行所在的塊号碼。
  • -c,—count 隻列印比對的行數,不顯示比對的内容。
  • -f File,—file=File 從檔案中提取模闆。空檔案中包含0個模闆,是以什麼都不比對。
  • -h,—no-filename 當搜尋多個檔案時,不顯示比對檔案名字首。
  • -i,—ignore-case 忽略大小寫差别。
  • -q,—quiet 取消顯示,隻傳回退出狀态。0則表示找到了比對的行。
  • -l,—files-with-matches 列印比對模闆的檔案清單。
  • -L,—files-without-match 列印不比對模闆的檔案清單。
  • -n,—line-number 在比對的行前面列印行号。
  • -s,—silent 不顯示關于不存在或者無法讀取檔案的錯誤資訊。
  • -v,—revert-match 反檢索,隻顯示不比對的行。
  • -w,—word-regexp 如果被<和>引用,就把表達式做為一個單詞搜尋。
  • -V,—version 顯示軟體版本資訊。
ls -l | grep '^a' 通過管道過濾ls -l輸出的内容,隻顯示以a開頭的行。
grep 'test' d* 顯示所有以d開頭的檔案中包含test的行。
grep 'test' aa bb cc 顯示在aa,bb,cc檔案中比對test的行。
grep '[a-z]' aa 顯示所有包含每個字元串至少有5個連續小寫字元的字元串的行。
grep 'w(es)t.*' aa 如果west被比對,則es就被存儲到記憶體中,并标記為1,然後搜尋任意個字元(.*),這些字元後面緊跟着另外一個es(),找到就顯示該行。如果用egrep或grep -E,就不用""号進行轉義,直接寫成'w(es)t.*'就可以了。
grep -i pattern files :不區分大小寫地搜尋。預設情況區分大小寫
grep -l pattern files :隻列出比對的檔案名,
grep -L pattern files :列出不比對的檔案名,
grep -w pattern files :隻比對整個單詞,而不是字元串的一部分(如比對‘magic’,而不是‘magical’),
grep -C number pattern files :比對的上下文分别顯示[number]行,
grep pattern1 | pattern2 files :顯示比對 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :顯示既比對 pattern1 又比對 pattern2 的行。
           

pattern為所要比對的字元串,可使用下列模式

. 比對任意一個字元
* 比對0 個或多個*前的字元
^ 比對行開頭
$ 比對行結尾
[] 比對[ ]中的任意一個字元,[]中可用 - 表示範圍,
例如[a-z]表示字母a 至z 中的任意一個
\ 轉意字元
           

xargs指令

【xargs定位參數位置 | xargs控制參數位置 | 如何定位控制xargs參數位置】

背景:

管道 + xargs用于把上遊輸出轉換為下遊參數輸入。

例如

ls *.bak | xargs rm -f

問題:

xargs預設把輸入作為參數放到指令的最後,但是很多指令需要自己定位參數的位置,比如拷貝指令

cp {上遊結果} destFolder

解決方法:

xargs 使用大寫字母i 定義參數訓示符 -I <訓示符>,然後用這個參數訓示符定位參數插入的位置, 例如:

ls *.bak | xargs -I % cp % /tmp/test
           
注釋:這裡使用%作為訓示符,第一個%可以了解為聲明,第二個%可以了解為調用。你也可以用其他字元,比如

ls *.bak | xargs -I {} cp {} /tmp/test

簡介

之是以能用到xargs這個指令,關鍵是由于很多指令不支援|管道來傳遞參數,而日常工作中有有這個必要,是以就有了xargs指令,例如:

find /sbin -perm +700 | ls -l       這個指令是錯誤的
find /sbin -perm +700 | xargs ls -l   這樣才是正确的

           

xargs 可以讀入 stdin 的資料,并且以空白字元或斷行字元作為分辨,将 stdin 的資料分隔成為 arguments 。 因為是以空白字元作為分隔,是以,如果有一些檔名或者是其他意義的名詞内含有空白字元的時候, xargs 可能就會誤判了~

選項解釋

-0 當sdtin含有特殊字元時候,将其當成一般字元,像/ ‘ 空格等

root@localhost:~/test#echo "//"|xargs  echo
root@localhost:~/test#echo "//"|xargs -0 echo
/
           

-a file 從檔案中讀入作為sdtin

root@localhost:~/test#cat test#!/bin/shecho "hello world/n"
root@localhost:~/test#xargs -a test echo#!/bin/sh echo hello world/n
root@localhost:~/test#
           
  • -e flag ,注意有的時候可能會是-E,flag必須是一個以空格分隔的标志,當xargs分析到含有flag這個标志的時候就停止。
root@localhost:~/test#cat txt
/bin tao shou kun
root@localhost:~/test#cat txt|xargs -E 'shou' echo
/bin tao
           
  • -p 當每次執行一個argument的時候詢問一次使用者。
root@localhost:~/test#cat txt|xargs -p echoecho /bin tao shou kun ff ?...y
/bin tao shou kun ff
           
  • -n num 後面加次數,表示指令在執行的時候一次用的argument的個數,預設是用所有的
root@localhost:~/test#cat txt|xargs -n1 echo
/bin
tao
shou
kun
root@localhost:~/test3#cat txt|xargs  echo
/bin tao shou ku
           
  • -t 表示先列印指令,然後再執行。
root@localhost:~/test#cat txt|xargs -t echoecho /bin tao shou kun
/bin tao shou kun
           
  • -i 或者是-I,這得看linux支援了,将xargs的每項名稱,一般是一行一行指派給{},可以用{}代替。
$ ls | xargs -t -i mv {} {}.bak
           
  • -r no-run-if-empty 當xargs的輸入為空的時候則停止xargs,不用再去執行了。
root@localhost:~/test#echo ""|xargs -t -r  mv
root@localhost:~/test#
           
  • -s num 指令行的最大字元數,指的是xargs後面那個指令的最大指令行字元數
root@localhost:~/test#cat test |xargs -i -x  -s 14 echo "{}"
exp1
exp5
file
xargs: argument line too long
linux-2
root@localhost:~/test#
           
  • -L num Use at most max-lines nonblank input lines per command line.-s是含有空格的。
  • -l 同-L
  • -d delim 分隔符,預設的xargs分隔符是回車,argument的分隔符是空格,這裡修改的是xargs的分隔符
root@localhost:~/test#cat txt |xargs -i -p echo {}echo /bin tao shou kun ?...y
root@localhost:~/test#cat txt |xargs -i -p -d " " echo {}echo /bin ?...y
echo tao ?.../bin
y
echo shou ?...tao
再如:
root@localhost:~/test#cat test |xargs -i -p -d " " echo {}echo exp1
exp5
file
linux-2
ngis_post
tao
test
txt
xen-3
?...y
root@localhost:~/test#cat test |xargs -i -p echo {}echo exp1 ?...y
echo exp5 ?...exp1
y
echo file ?...exp5
y
           
  • -x exit的意思,主要是配合-s使用。
  • -P 修改最大的程序數,預設是1,為0時候為as many as it can

其他查找指令

1. locate指令

locate指令其實是“find -name”的另一種寫法,但是要比後者快得多,原因在于它不搜尋具體目錄,而是搜尋一個資料庫(/var/lib/locatedb),這個資料庫中含有本地所有檔案資訊。Linux系統自動建立這個資料庫,并且每天自動更新一次,是以使用locate指令查不到最新變動過的檔案。為了避免這種情況,可以在使用locate之前,先使用updatedb指令,手動更新資料庫。

locate指令的使用執行個體:

$ locate /etc/sh
搜尋etc目錄下所有以sh開頭的檔案。
$ locate -i ~/m
搜尋使用者主目錄下,所有以m開頭的檔案,并且忽略大小寫。
           

2. whereis指令

whereis指令隻能用于程式名的搜尋,而且隻搜尋二進制檔案(參數-b)、man說明檔案(參數-m)和源代碼檔案(參數-s)。如果省略參數,則傳回所有資訊。

whereis指令的使用執行個體:

$ whereis grep
grep: /bin/grep /usr/share/man/man1p/grep.1p.gz /usr/share/man/man1/grep.1.gz
           

3. which指令

which指令的作用是,在PATH變量指定的路徑中,搜尋某個系統指令的位置,并且傳回第一個搜尋結果。也就是說,使用which指令,就可以看到某個系統指令是否存在,以及執行的到底是哪一個位置的指令。

which指令的使用執行個體:

$ which grep
/bin/grep

           
上一篇: 2018-09-04
下一篇: 墨卡托投影