Ssh

如何為 plink.exe 設置環境變數?

  • December 12, 2017

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沒有被閱讀;跟踪事情以查看發生了什麼。

引用自:https://unix.stackexchange.com/questions/410446