Ssh
如何為 plink.exe 設置環境變數?
plink
是 Windows 執行檔,它通過 ssh 連接並在伺服器端執行一些命令。例如
plink myname@mycomputer ls
將顯示 ls 命令的結果,在 myname 的主目錄中執行。
不幸的是,既沒有
~/.profile
也沒有~/.bashrc
被執行。什麼是
ssh
連接契約,什麼定義,哪些變數已設置,哪些未設置?如果我跑plink myname@mycomputer env
我看到了一些變數,例如
HOME
,PWD
並且LOGNAME
是特定於使用者的。其他的怎麼設置?以下都沒有幫助:
plink myname@mycomputer sh -c env plink myname@mycomputer bash -c env
這些命令有效,但顯示了“裸”變數集。
如何告訴 shell 為使用者執行它的初始腳本?
ssh
例如在一個終端中可以觀察到什麼執行sysdig
,然後在其他地方執行plink myname@mycomputer uptime
應該顯示類似$ sudo sysdig -p '%proc.cmdline' 'evt.type = execve' sshd bash -c uptime bash -c uptime uptime
所以在這種情況下正在使用參數執行(例如在預設情況下
bash
不安裝的 Alpine Linux 上可能不是這種情況) 。這或多或少會直接導致該命令,因為沒有花哨的管道或需要繼續執行的多個 shell 命令。bash``-c uptime``bash``exec``bash
接下來,我們可以記錄
bash
打開了哪些文件,然後再次執行plink ... uptime
命令(這可能會更詳細,具體取決於系統上發生的其他情況):$ sysdig 'evt.type = open and proc.name = "bash"' 7847 16:03:48.388447919 0 bash (22135) > open 7848 16:03:48.388466237 0 bash (22135) < open fd=3(<f>/etc/ld.so.cache) name=/etc/ld.so.cache flags=4097(O_RDONLY|O_CLOEXEC) mode=0 7855 16:03:48.388669720 0 bash (22135) > open 7856 16:03:48.388695391 0 bash (22135) < open fd=3(<f>/lib64/libtinfo.so.5) name=/lib64/libtinfo.so.5 flags=4097(O_RDONLY|O_CLOEXEC) mode=0 7871 16:03:48.389069345 0 bash (22135) > open 7872 16:03:48.389082901 0 bash (22135) < open fd=3(<f>/lib64/libdl.so.2) name=/lib64/libdl.so.2 flags=4097(O_RDONLY|O_CLOEXEC) mode=0 7885 16:03:48.389284722 0 bash (22135) > open 7886 16:03:48.389290872 0 bash (22135) < open fd=3(<f>/lib64/libc.so.6) name=/lib64/libc.so.6 flags=4097(O_RDONLY|O_CLOEXEC) mode=0 7921 16:03:48.391876315 0 bash (22135) > open 7922 16:03:48.391927051 0 bash (22135) < open fd=-6(ENXIO) name=/dev/tty flags=67(O_NONBLOCK|O_RDWR) mode=0 7945 16:03:48.393905761 0 bash (22135) > open 7946 16:03:48.393957884 0 bash (22135) < open fd=3(<f>/proc/meminfo) name=/proc/ meminfo flags=4097(O_RDONLY|O_CLOEXEC) mode=0 8049 16:03:48.395910893 0 bash (22135) > open 8050 16:03:48.395916693 0 bash (22135) < open fd=3(<f>/root/.bashrc) name=/root/.bashrc flags=1(O_RDONLY) mode=0
因此
/root/.bashrc
,我的測試虛擬機似乎正在閱讀這裡;為了確認這一點,我們可以在該文件中添加一些內容,然後在伺服器上再次執行我們的測試命令:echo echo echo >> ~/.bashrc
然後我們再次連接(
plink ...
根據需要調整命令)$ ssh gato uptime echo 16:05:20 up 5:19, 1 user, load average: 0.11, 0.38, 0.27 $
所以在這種情況下
.bashrc
正在讀取,所以你可以把命令放在那裡。我不確定您的情況為什麼.bashrc
沒有被閱讀;跟踪事情以查看發生了什麼。