shell指令碼在遠端鏈結執行命令時遇到了一系列問題

2021-10-14 03:22:59 字數 2683 閱讀 8984

前提:機器之間互聯互通的,最好都配置了免密登入,不然的話會輸入密碼很麻煩

推薦使用第三種方式。

啟動後台程序:

ssh user@host 『command1 &;command2『;
有的會輸出日誌,占用終端,那麼接下來的指令就不能用。採用輸出重定向解決;

ssh user@host 『command1 &

>> file;command2『;

這樣有個缺點,就是輸出到日誌檔案之後,有的程序還是會占有shell指令碼,無法執行command2,而且如果執行命令比較多,非常亂。這種方式就好像在命令列中一行一行執行,並且不會亂,首選第三種。

ssh user@host <<

eof command1

command2

commandx >> file & // 這樣就不會占有終端,繼續執行下面的指令

command3

command4

eof

可能還會碰見這個問題。字面意思是偽終端將無法分配,因為標準輸入不是終端。雖然沒什麼影響,但是很煩。具體原理沒有深究,兩種解決解決方法:

方法1 :每個終端都列印出執行的命令,這種看著也亂,使用第二種

ssh -t -t user@host <<

eof command1

command2

command3

command4

eof

方法2 :直接及解決

ssh -tq user@host <<

eof command1

command2

command3

command4

eof

ssh遠端執行腳本報錯"command not found",且環境變數不生效,原因是之前將環境變數配置在了/etc/profile中,但是ssh遠端執行指令碼時實際上執行的是non-login shell,而non-login shell不會讀取/etc/profile配置檔案。用ssh客戶端(比如putty)登陸linux系統時,要求輸入使用者名稱/密碼登入或根據ssh key登入時,就是login shell。

而在a機器上再用ssh免密碼登入b機器,在b機器上執行shell指令碼,就是non-login shell。不會讀取/etc/profile,shell指令碼使用這種方法也屬於non-login shell

login-shell讀取環境變數配置檔案:

/etc/profile

~/.bash_profile

~/.profile

~/.bashrc

/etc/bashrc

non-login shell讀取環境變數配置檔案:

/etc/bashrc

~/.bashrc

這裡面涉及到的東西比較複雜和多

一般來說ssh執行多行命令,或者cat執行多行檔案,都會用到here document,但是呢,這裡面分為兩種情況:

如果是正常的

#!/bin/bash

id=1

ssh -tq root@host << eof // 代表會將其中用到的變數和命令在本地解析之後再傳給遠端主機執行

id=2

echo

$id // id為1,在本地就解析了

eof

如果不想做任何本地解析,就要加上\ , 』 ', 或者「 」 ,也就是\eof,「eof」,『eof』

#!/bin/bash

id=1

ssh -tq root@host <<

'eof' // \eof,"eof",'eof',代表這些命令列在本地不做任何解析,在遠端才開始解釋

id=2

echo

$id // id為2,傳過去,再繼續解析的

eof

近期發現,here document遠端執行命令時無法用執行cat,more,less,head命令列印檔案賦值給變數的操作,但是here document加上』 '單引號就可以一般來說,登入機器用自己的使用者名稱,執行sudo命令會出現沒有sudo的許可權,這就是使用,所以需要將使用者名稱加入sudo許可權才可以

在遠端機器上執行

sudo visudo
在檔案最後一行新增:

$username	all=

(all:all) nopasswd:all

這一般是集群管理員幹的事兒,但是的ubuntu系統還需要配置root使用者,很不方便,而centos系統是自帶的。

shell指令碼直接執行和crontab結果不一樣

解決方法.1.原有的crontab中設定為 注 相關名字有改變,不影響說明 usr home pro check test.sh usr home pro check log test.date y m d log 改後為 cd usr home pro check bash test.sh usr...

linux中利用shell指令碼條件執行命令

在linux環境中,我們總會有一些命令需要經常用,例如經常跳轉到某些目錄下或者執行某些命令,輸入一連串的命令是很煩的,此時我們可以預先寫一些指令碼然後根據我們的選擇自動執行命令,那豈不是完美,本指令碼就是為此而生的 以跳轉不同的目錄舉例,當然也可以執行其他命令,這時候只需要模擬寫shell命令即可 ...

在遠端伺服器上執行本地的shell指令碼

1 使用ssh實現 ssh user hostname c bin bash test.sh2 使用expect實現 採用的策略就是先在本地通過expect把shell指令碼推送到遠端伺服器上,之後再用expect模擬登入之後,先給遠端的shell指令碼許可權,然後再執行指令碼,最後刪除指令碼就ok...