ssh執行遠端指令碼遇到的坑
最新在搭建新的產品環境就遇到了一個坑,使用js 的node-ssh module執行遠端機器的sh指令碼的時候發現,無法獲取全域性的環境變數。我們知道linux機器的全域性環境變數的設定是在/etc/profile這個檔案中的。我在這個檔案中新增了JAVA_HOME的環境變數,並將java的bin目錄新增到了$PATH中,但是通過ssh執行遠端指令碼的時候拿到的JAVA_HOME的值是空的,但是如果通過xshell工具ssh到遠端主機就可以拿到環境變數,當時不理解是為什麼?後臺通過查了一些資料才瞭解大致原因。
原來通過ssh執行遠端的命令或者指令碼和通過ssh登入到遠端主機後在執行指令碼這兩種方式的bash模式不同。bash工作模式主要分為:login + interactive,login + non-interactive ,non-login + interactive ,non-login + non-interactive 。login 是指需要輸入使用者名稱和密碼登陸的 shell; interactive 顧名思義為互動式,命令的標準輸入與輸出為該 bash 繫結到的終端。
* login + interactive
* 登陸 Linux 獲取的第一個 shell
* 通過 ssh user_name @ romote_ip 登陸獲取到的 shell
* 執行命令 bash -l 進入的 shell
* 首先讀取 /etc/profile 檔案
* 再從下面三個檔案讀取到第一個存在的檔案
~/.bash_profile、~/.bash_login、~/.profile
etc/profile 會依次讀取 /etc/profile.d 下所有檔案
* login + non-interactive
* 執行命令 bash -l script.sh
*配置檔案讀取同上 該模式比較少用
* non-login + interactive
* 執行命令bash
* 讀取 /etc/bash.bashrc
* 讀取 ~/.bashrc檔案
* non-login + non-interactive
* 執行命令 bash script.sh
* 讀取環境變數 $BASH_ENV 的值,匯入該值的配置檔案
通過SSH登入後在執行指令碼
這種方式使用的是Bash的interactive + login shell模式。
這種模式下回讀取優先讀取/etc/profile的配置,所謂我設定的環境變數是能夠讀取到的。通過ssh遠端執行指令碼命令
這個方式使用的是bash的non-login + non-interactive模式。是不會讀取/etc/profile中的配置,所以我設定的環境變數是獲取不到的,於是我就去之前已經搭建好的機器上檢視了$BASH_ENV這個變數的值,發現是空的,這就很奇怪了,為什麼這個值是空的ssh遠端執行指令碼的時候也能成功的拿到JAVA_HOME這個環境變數呢? 後來發現是在~/.bashrc中檔案中設定的,但是按照上面的工作模式應該是不會讀取這個配置的,於是就又去查了一下資料,從幫助文件中找到了原因:
Bash attempts to determine when it is being run with its standard input connected to a network connection,
as when executed by the remote shell daemon,
usually rshd, or the secure shell daemon sshd.
If bash determines it is being run in this fashion,
it reads and executes commands from ~/.bashrc,
if that file exists and is read‐ able.
大致的意思就是 bash 會判斷標準輸入是否關聯到 sshd 這樣的網路連結上,如果是,會讀取 ~/.bashrc 配置檔案。
所以要解決SSH遠端執行命令時找不到自定義環境變數的問題,那麼可以在登入使用者的HOME目錄的.bashrc中新增需要的環境變數。
相關文章
- SSH 無密碼遠端執行指令碼密碼指令碼
- 使用bat指令碼執行MySQL命令時遇到的坑BAT指令碼MySql
- SSH 遠端執行任務
- Go實現ssh執行遠端命令及遠端終端Go
- Go語言:crypto/ssh執行遠端命令Go
- CentOS使用expect批次遠端執行指令碼和命令CentOS指令碼
- seleniumGrid分散式遠端執行測試指令碼分散式指令碼
- 判斷ssh遠端命令是否執行結束
- 使ssh不用輸入密碼(指令碼執行scp)密碼指令碼
- ThinkPHP遠端程式碼執行漏洞PHP
- phpunit 遠端程式碼執行漏洞PHP
- Mac 終端執行 shell 指令碼Mac指令碼
- Joomla遠端程式碼執行漏洞分析OOM
- WordPress 3.5.1遠端程式碼執行EXP
- OpenWRT 曝遠端程式碼執行漏洞
- 記一次paramiko遠端連線遇到的坑
- 遠端執行命令
- 如何通過 SSH 在遠端 Linux 系統上執行命令Linux
- ubuntu 修改ssh遠端主機名稱,mac開機執行命令,靜默方式啟動virtual box虛擬機器,靜默執行run指令碼UbuntuMac虛擬機指令碼
- 解決SSH遠端執行命令找不到環境變數的問題變數
- 什麼是遠端程式碼執行漏洞?
- ThinkPHP 5.0.23 遠端程式碼執行漏洞PHP
- SSH 遠端登入「記住密碼」密碼
- 遠端分發sh指令碼指令碼
- ElasticSearch Groovy指令碼遠端程式碼執行漏洞分析(CVE-2015-1427)Elasticsearch指令碼
- windows ssh遠端登入阿里雲遇到permissions are too open的錯誤Windows阿里
- [譯] 通過 SSH 遠端使用 Python 直譯器來執行 FlaskPythonFlask
- Discuz! X系列遠端程式碼執行漏洞分析
- .NET Remoting 遠端程式碼執行漏洞探究REM
- crash_for_windows_pkg遠端程式碼執行漏洞Windows
- WindowsJScript元件曝遠端程式碼執行漏洞WindowsJS元件
- PHP CGI Windows下遠端程式碼執行漏洞PHPWindows
- log4j遠端程式碼執行漏洞
- ssh 信任,免密碼到遠端機器密碼
- [轉]使用ts-node執行ts指令碼以及踩過的坑指令碼
- sqlplus執行指令碼時遇到錯誤自動停止SQL指令碼
- SSH 隧道遠端連線
- SSH遠端登入原理