shell 常用命令

shell 常用命令

expect

expect 命令是用來(lái)實(shí)現(xiàn)自動(dòng)化交互通信的沮尿,比如當(dāng)你在腳本中通過(guò)某些命令登錄绍绘、連接握联、上傳从橘、下載等和遠(yuǎn)程服務(wù)器的交互時(shí)烫扼,可能需要讓你輸入一些賬號(hào)姻政、密碼等信息

如果這個(gè)過(guò)程是人工手動(dòng)在終端執(zhí)行的浩考,那沒(méi)啥問(wèn)題婶肩,需要交互時(shí)捌袜,你手動(dòng)輸入即可

但如果這個(gè)過(guò)程是交由腳本來(lái)自動(dòng)執(zhí)行的说搅,難不成每次腳本執(zhí)行時(shí),還需要你在旁邊等著來(lái)輸密碼嗎虏等?

所以弄唧,就可以借助 expect 來(lái)實(shí)現(xiàn)這個(gè)交互過(guò)程

可以先用 whereis 命令查找看看,是否支持 expect 命令霍衫,否則需要自行安裝

whereis expect
# expect: /usr/bin/expect /usr/share/man/man1/expect.1.gz

安裝

# Centos 系統(tǒng)的安裝候引,其余的自行查閱
#先下載 tcl,expect 依賴 tcl
yum -y install tcl

#再下載 tcl
yum -y install expect

#安裝完執(zhí)行 expect慕淡,查看是否安裝成功背伴,失敗原因請(qǐng)自行查閱
[root@VM_0_15_centos test]# expect
expect1.1> 

基本命令

  • spawn:用于啟動(dòng)一個(gè)子進(jìn)程來(lái)執(zhí)行后續(xù)命令

  • expect eof:用來(lái)退出 spawn 啟動(dòng)的子進(jìn)程,返回到當(dāng)前進(jìn)程環(huán)境峰髓,與 spawn 成對(duì)出現(xiàn)

  • expect:用于接收進(jìn)程的輸出信息(輸出重定向到 expect)傻寂,如果接收的字符串與期待的不匹配,則一直阻塞携兵,直到匹配上或者超過(guò)才繼續(xù)往下執(zhí)行

  • send:用于向進(jìn)程發(fā)送輸入信息(輸入重定向到 send)疾掰,通常需要以 \n 結(jié)尾

  • set timeout 1:用于設(shè)置 expect 命令的超時(shí)時(shí)間,單位 s徐紧,輸入 -1 時(shí)表示無(wú)限長(zhǎng)静檬,默認(rèn)為 10s

  • [lindex $argv n]:用于獲取傳入給腳本的參數(shù),n 表示第幾個(gè)參數(shù)并级,下標(biāo)從 0 開(kāi)始

  • set key value:用于設(shè)置變量拂檩,通常在腳本文件開(kāi)頭結(jié)合上面獲取參數(shù)使用,來(lái)給參數(shù)賦值個(gè)有意義的變量嘲碧,如 set ip [lindex $argv 0]

  • exp_continue:用于 expect 中需要復(fù)用匹配

  • send_user:用于打印輸出稻励,相當(dāng)于 echo

  • interact:結(jié)束自動(dòng)化交互,轉(zhuǎn)入人工交互,如果腳本是純自動(dòng)化場(chǎng)景望抽,那么不應(yīng)該有這條命令加矛,腳本執(zhí)行結(jié)束則退出。如果是半自動(dòng)化場(chǎng)景煤篙,如自動(dòng)輸入賬號(hào)密碼斟览,連接登錄操作,登錄之后交由人工交互辑奈,那可以使用該命令

    expect 命令后面可跟隨字符串或?qū)ο罂撩纾?/p>

expect "password"
send "xxx"

# 或者

expect {
  "yes" {
    send "yes\n"
    exp_continue
  }
  "password" {
    send "xxx"
    expect "xxx"
    send "xxx"
  }
}

使用

#!/usr/bin/expect
# 使用 expect 結(jié)合 ssh 登錄遠(yuǎn)程服務(wù)器

# 將傳給腳本的參數(shù)賦值給變量
set sshPort [lindex $argv 0]
set user [lindex $argv 1]
set ip [lindex $argv 2]
set password [lindex $argv 3]

# spawn 命令新啟子進(jìn)程,執(zhí)行后面的命令
spawn ssh -p $sshPort $user@$ip
expect "password"
send "$password\n"
expect eof
exit 0

在當(dāng)前 shell 里執(zhí)行:

/usr/bin/expect login.sh "22" "root" "127.0.0.1" "xxxxx"

其實(shí)鸠窗,個(gè)人覺(jué)得味悄,expect 就是利用了 shell 的輸入輸出重定向,原先在終端里人工進(jìn)行交互時(shí)塌鸯,由人工手動(dòng)將命令輸入給終端,命令執(zhí)行結(jié)果輸出到終端給用戶反饋

而 expect 則是將輸入由傳統(tǒng)的人工輸入給終端重定向到由 send 命令輸入唐片,也就是輸入信息從 send 讀取丙猬,而命令執(zhí)行結(jié)果也不是輸出給終端,而是輸出給 expect 命令费韭,這樣一來(lái)茧球,就可以實(shí)現(xiàn)由腳本來(lái)自動(dòng)化處理交互,畢竟輸入輸出腳本都可以拿到了

以上星持,個(gè)人理解

ssh

遠(yuǎn)程連接工具抢埋,用來(lái)登錄遠(yuǎn)程服務(wù)器

通常來(lái)說(shuō),借助 XShell 的可視化配置督暂,就足夠連接上服務(wù)器了揪垄,但有些服務(wù)器,只能通過(guò)跳板機(jī)連接逻翁,此時(shí)就需要先登錄上跳板機(jī)饥努,然后再跳板機(jī)上使用 ssh 命令來(lái)連接服務(wù)器

當(dāng)然,XShell 也可以通過(guò) ssh 來(lái)連接登錄服務(wù)器八回,你不用圖形界面的操作也行

使用

ssh -p 22 root@ip

很簡(jiǎn)單酷愧,指定端口,登錄用戶缠诅,ip 地址就可以了溶浴,然后再手動(dòng)輸入密碼

如果不想每次登錄都輸入密碼,那么需要配置 ssh 私鑰管引、公鑰士败,將公鑰放置在服務(wù)器上

  • netstat -lntup | grep ssh

遠(yuǎn)程服務(wù)器上查看 ssh 端口號(hào),默認(rèn)是 22

  • service sshd reload

重啟 ssh 服務(wù)汉匙,因?yàn)榭赡苄枰呐渲梦募八福缧薷哪J(rèn) 22 端口

scp

scp 命令用于 Linux 之間復(fù)制文件和目錄生蚁,也就是直接跟遠(yuǎn)程服務(wù)器進(jìn)行文件或目錄的拷貝

跟 cp 很類似,區(qū)別在于一個(gè)僅在本機(jī)間拷貝戏自,一個(gè)是多機(jī)子間的拷貝

語(yǔ)法

usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2
           
# 簡(jiǎn)易寫法

scp [可選參數(shù)] file_source file_target

比較重要的也就是最后的 [[user@]host]file邦投,可以指定連接遠(yuǎn)程的用戶,ip擅笔,不指定時(shí)志衣,將在命令執(zhí)行時(shí),手動(dòng)輸入

常用參數(shù)說(shuō)明

  • -p:保留原文件的修改時(shí)間猛们,訪問(wèn)時(shí)間和訪問(wèn)權(quán)限念脯。

  • -r: 遞歸復(fù)制整個(gè)目錄。

  • -v:詳細(xì)方式顯示輸出弯淘。scp和ssh(1)會(huì)顯示出整個(gè)過(guò)程的調(diào)試信息绿店。這些信息用于調(diào)試連接,驗(yàn)證和配置問(wèn)題庐橙。

  • -P:注意是大寫的P, port是指定數(shù)據(jù)傳輸用到的端口號(hào)

實(shí)例

  • 從本地復(fù)制到遠(yuǎn)程
# 將本地多個(gè)文件復(fù)制到遠(yuǎn)程 target 目錄下假勿,多個(gè)文件間以空格隔開(kāi)
scp -P 5432 -p xxx.jar xxx1.jar root@ip:target

# 將本地文件 1.mp3 拷貝到遠(yuǎn)程服務(wù)器上的 001.mp3 文件里
scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music/001.mp3 
  • 從遠(yuǎn)程拷貝到本地
# 將遠(yuǎn)程目錄拷貝到當(dāng)前目錄下
scp -r root@192.16.1.108:/var/www/blog . 

當(dāng)沒(méi)有指定用戶名時(shí),命令輸入完畢需要手動(dòng)輸入用戶名和密碼态鳖,指定了用戶名后转培,需要輸入密碼

密碼的輸入可以借助 expect 來(lái)實(shí)現(xiàn)自動(dòng)交互

當(dāng)然,也可以通過(guò) -B浆竭,以及其他參數(shù)來(lái)指定 ssh 連接的配置文件浸须,實(shí)現(xiàn)無(wú)密碼方式拷貝,相關(guān)信息邦泄,自行查閱

sz, rz

如果是借助 XShell 工具連接上遠(yuǎn)程服務(wù)器后删窒,那么可借助 sz, rz 命令來(lái)下載和上傳文件

但如果遠(yuǎn)程服務(wù)器沒(méi)有這兩個(gè)命令的話,需要先進(jìn)行安裝:

安裝

# CentOs 安裝
yum -y install lrzsz

# Ubuntu 安裝
sudo apt-get install lrzsz

使用

sz xxx.file
rz

下載文件的話虎韵,需要指定下載哪個(gè)文件易稠,上傳則不用,因?yàn)闀?huì)打開(kāi)文件選擇彈框包蓝,選中即可

sftp

也是一個(gè)用來(lái)跟遠(yuǎn)程服務(wù)器上的文件進(jìn)行下載驶社、上傳的命令

sz,rz 通常是本機(jī)上裝了個(gè) XShell 工具,然后用于兩機(jī)之間的文件通信

但有時(shí)候测萎,是需要在遠(yuǎn)程多個(gè)服務(wù)器之間進(jìn)行文件通信亡电,這時(shí)候就用不了 XShell,也就用不了 sz, rz 命令了

這種場(chǎng)景硅瞧,可以使用 scp 命令份乒,也可以使用 sftp 命令

使用

# 先連接,端口跟 ssh 一致
sftp -P 22 root@ip

# help 命令,可以查看 sftp 支持的命令,比如 ls,lls,cd,lcd...
help

# 所有命令前加 l,表示針對(duì)本機(jī)的操作或辖,不加 l 表示針對(duì)遠(yuǎn)程服務(wù)器的操作
# 本機(jī)進(jìn)入 tmp 目錄
lcd /tmp/

# 下載遠(yuǎn)程文件到當(dāng)前目錄下
get /usr/local/xxx.file

# 上傳當(dāng)前目錄下的文件到遠(yuǎn)程指定目錄下
put xxx.file /usr/local/

有一點(diǎn)需要注意瘾英,如果本機(jī)是 window 系統(tǒng),那么在 window 系統(tǒng)和 linux 系統(tǒng)之間是有 sftp 傳輸文件時(shí)颂暇,由于文件系統(tǒng)的分隔符不一樣缺谴,在操作 lcd 命令時(shí),可能會(huì)有問(wèn)題耳鸯,此時(shí)湿蛔,可以直接輸入 lcd,然后會(huì)彈窗文件選擇框县爬,選中路徑后按確定即可阳啥,比較方便

tail

通常用來(lái)實(shí)時(shí)查看日志文件:

tail -f xxx.log

這樣,只要有新日志寫入财喳,會(huì)馬上在終端上輸出察迟,就可以不用每次都把文件下載下來(lái)了

實(shí)例-jenkins 構(gòu)建 spring-boot 項(xiàng)目并部署遠(yuǎn)程服務(wù)器上

場(chǎng)景是這樣的,本地開(kāi)發(fā)后端 spring-boot 項(xiàng)目耳高,然后有一臺(tái)專門的 jenkins 服務(wù)器卷拘,自動(dòng)或手動(dòng)觸發(fā)構(gòu)建

jenkins 構(gòu)建時(shí),會(huì)自動(dòng)去拉取代碼祝高,然后執(zhí)行 package.sh 打包腳本,生成 jar 包

再然后污筷,執(zhí)行 deploy.sh 腳本工闺,將 jar 發(fā)送到另一臺(tái)項(xiàng)目運(yùn)行的服務(wù)器上,先停止舊項(xiàng)目的執(zhí)行瓣蛀,然后移除舊 jar 包陆蟆,執(zhí)行新 jar 包,啟動(dòng)后端項(xiàng)目

package.sh

打包腳本

#!/bin/sh

# 打包的渠道由外部傳入
environment=$1
basedir=`pwd`
# 先將舊的打包文件刪除惋增, -d 表示判斷 target 是否是目錄
if [ -d "target" ]; then
    rm -rf $basedir/target
fi

mkdir target

# 定義 mvn 打包的函數(shù)
package()
{   
    # mvn packgae打包
    (mvn clean packge -P $environment)
    # 如果 mvn 命令執(zhí)行異常叠殷,將會(huì)返回非0,終止腳本诈皿,異常退出
    if [ $? -ne 0 ]; then
        exit 1
    fi
}

# 進(jìn)入項(xiàng)目根目錄林束,執(zhí)行打包工作
cd $basedir/app
package


exit 0

deploy.sh

部署腳本

#!/usr/bin/expect

# 將傳給腳本的參數(shù)賦值給變量
set ip [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set password [lindex $argv 3]
set targetDir [lindex $argv 4]

# 先另起進(jìn)程,用 scp 命令稽亏,將打包好的 jar 包發(fā)送到項(xiàng)目運(yùn)行的服務(wù)器上
spawn scp -P $port target/xxx.jar $user@$ip:$targetDir

# 用 expect 解決 scp 需要輸入命令的交互壶冒,實(shí)現(xiàn)自動(dòng)化
expect {
    "yes/no" {
        send "yes\n"
        exp_continue
    }
    "password" {
        send "$password\n"
    }
}
# jar 發(fā)送完畢就退出子進(jìn)程,返回主進(jìn)程截歉,繼續(xù)處理往下命令
expect eof

# 另起進(jìn)程執(zhí)行 ssh 連接項(xiàng)目運(yùn)行的服務(wù)器
spawn ssh -p $port -o "StrictHostKeyChecking no" $user@$ip

# 用 expect 解決 ssh 需要輸入命令的交互胖腾,實(shí)現(xiàn)自動(dòng)化
expect {
    "password" {
        send "$password\n"
    }
}

# 登錄成功,則發(fā)送需要在遠(yuǎn)程服務(wù)器上執(zhí)行的命令
expect "login"

# 包括,停止舊項(xiàng)目咸作,執(zhí)行新項(xiàng)目
send "

# 進(jìn)入 jar 包存放目錄
cd xxx
# 停止運(yùn)行
kill -9 `ps aux|grep 'xxx.jar'|grep -v grep|awk '{print $2}'`  
# 備份
cp xxx.jar xxx.jar.bak
# 移新包
mv $targetDir/xxx.jar xxx
# 啟動(dòng)項(xiàng)目
su - www -c "nohup java -jar xxx.jar &"

sleep 10s
exit 0
"
expect eof
exit 0

jenkins - 構(gòu)建 shell

jenkins 配置里的構(gòu)建 shell 命令

#!/bin/sh
source /etc/profile
# 先執(zhí)行打包腳本锨阿,指定打包的渠道
sh jenkins/package.sh online

# 如果打包失敗,終止
if [ $? -ne 0 ]; then
   exit 1
fi

# 執(zhí)行部署腳本记罚,指定項(xiàng)目運(yùn)行的服務(wù)器的連接端口號(hào)墅诡,ip,登錄用戶毫胜,密碼书斜,移包路徑
/usr/bin/expect jenkins/deploy.sh "127.0.0.1" "22" "root" "xxxx" "/temp/"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酵使,隨后出現(xiàn)的幾起案子荐吉,更是在濱河造成了極大的恐慌,老刑警劉巖口渔,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件样屠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缺脉,警方通過(guò)查閱死者的電腦和手機(jī)痪欲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)攻礼,“玉大人业踢,你說(shuō)我怎么就攤上這事〗赴纾” “怎么了知举?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)太伊。 經(jīng)常有香客問(wèn)我雇锡,道長(zhǎng),這世上最難降的妖魔是什么僚焦? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任锰提,我火速辦了婚禮,結(jié)果婚禮上芳悲,老公的妹妹穿的比我還像新娘立肘。我一直安慰自己,他們只是感情好名扛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赛不。 她就那樣靜靜地躺著,像睡著了一般罢洲。 火紅的嫁衣襯著肌膚如雪踢故。 梳的紋絲不亂的頭發(fā)上文黎,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音殿较,去河邊找鬼耸峭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛淋纲,可吹牛的內(nèi)容都是我干的劳闹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼洽瞬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼本涕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起伙窃,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤菩颖,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后为障,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體晦闰,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年鳍怨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呻右。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鞋喇,死狀恐怖声滥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侦香,我是刑警寧澤醒串,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鄙皇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仰挣。R本人自食惡果不足惜伴逸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膘壶。 院中可真熱鬧错蝴,春花似錦、人聲如沸颓芭。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亡问。三九已至官紫,卻和暖如春肛宋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背束世。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工酝陈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毁涉。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓沉帮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贫堰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穆壕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 常用命令 想看看你的Shell是哪一種,執(zhí)行命令: echo $SHELL在Linux中其屏,$符號(hào)代表一個(gè)shell...
    蒲公英少年閱讀 3,632評(píng)論 1 16
  • shell中各種括號(hào)的使用方法(摘自網(wǎng)絡(luò)) 在這里我想說(shuō)的是幾種shell里的小括號(hào),大括號(hào)結(jié)構(gòu)和有括號(hào)的變量喇勋,命...
    草中人閱讀 526評(píng)論 0 0
  • Shell常用命令 工欲善其事,必先利其器漫玄。無(wú)論是做哪一方面開(kāi)發(fā)的程序員茄蚯,都免不了和shell打交道,不管是基于L...
    擦柱而出閱讀 939評(píng)論 0 16
  • 一睦优、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評(píng)論 0 10
  • 有兩種方案處理angular中的class渗常,ng-class與原本class沒(méi)有沖突,最后是拼在一起的汗盘。1.字符串...
    laiyituan閱讀 1,121評(píng)論 0 1