Linux

~/.bashrc 不是來自 ssh ‘command’

  • May 5, 2021

最後.bashrc我補充說:

touch /tmp/bash_noninteractive_test

跑:

/usr/bin/ssh -v -C root@example.com 'ls'

在主機上(之前以互動方式登錄):

% ls -l /tmp/bash_noninteractive_test
ls: cannot access /tmp/bash_noninteractive_test: No such file or directory

我認為~./bashrc總是來源於非互動式外殼,比如通過 SSH?我該如何解決?

受影響的系統:

% lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: trusty

% lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 8.11 (jessie) Release: 8.11 Codename: jessie

來自 INVOCATION 章節man bash

當一個不是登錄 shell 的互動式 shell 啟動時,bash 會從/etc/bash.bashrc和讀取並執行命令~/.bashrc,如果這些文件存在的話。這可以通過使用該--norc選項來禁止。file 選項將--rcfile強制 bash 從 file 而不是/etc/bash.bashrcand讀取和執行命令~/.bashrc

例如,當 bash 以非互動方式啟動時,為了執行一個 shell 腳本,它會BASH_ENV在環境中查找變數,如果它出現在那裡,則展開它的值,並將展開的值用作要讀取和執行的文件的名稱。Bash 的行為就像執行了以下命令:

         if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

但 PATH 變數的值不用於搜尋文件名。

因此,除非指向它,否則它似乎~/.bashrc永遠不會來源於非互動式外殼。BASH_ENV

根據您希望實際實現的目標,您可能會考慮在遠端主機上啟用PermitUserRC和/或PermitUserEnvironmentin /etc/ssh/sshd_config,然後將所需的環境變數~/.ssh/environment和/或所需的命令寫入~/.ssh/rc.

**注意:**如果您計劃將 SSH X11 轉發與 一起使用~/.ssh/rc,則必須包含一段程式碼以將 X11 會話顯式提供給xauth -q -命令;sshd(8)請參閱手冊頁SSHRC 章節中的範例。

引用自:https://serverfault.com/questions/936746