这是这个问题的后续问题:ssh,启动特定的 shell,并在远程计算机上运行命令?,除了更具体地关于ash
,并重点关注以下事实:在 ssh 会话中启动 shell 时获取 .bashrc 文件对我来说不起作用。
我使用的是嵌入式 Linux 设备,该设备有 busybox 版本的sh
和ash
,但没有bash
.我们共享一个共同的用户名(root
)和一个共同的执行环境。
不过,我想要一些自定义别名和自定义PS1
提示字符串 1 变量。
这是一个正常 ssh 会话的示例。请注意,我使用sshpass
将密码传递给ssh
,并将密码存储在~/pw
文件中。
您可以看到默认 shell 是-sh
并且没有别名。默认PS1
提示字符串也不显示路径。
$ sshpass -f ~/pw ssh [email protected] [root@device]$ echo $0 -sh [root@device]$ alias [root@device]$
该设备没有bash
,但它确实有ash
,这显然与 bash 类似。所以,我想在 ssh 时将其作为我的 shell。我还想复制 Ubuntu 的默认~/.bashrc
文件,位于/etc/skel/.bashrc
我正在 ssh 的 Ubuntu 机器上从,到设备 at/tmp/.bashrc
以便我可以获取它,并且我希望我的 ssh 命令能够做到这一点。我无法复制到~/.bashrc
远程设备,因为主目录是只读的。
我尝试了以下操作,但出现以下错误:
命令:
sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp/.bashrc \
&& sshpass -f ~/pw ssh -t [email protected] '. /tmp/.bashrc'
结果:
Connection to 192.168.0.2 closed.
未建立 ssh 会话。
ash
然后我尝试了以下命令,结果如下,显示尽管输入了 shell ,但采购不起作用。
$ sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp/.bashrc \ && sshpass -f ~/pw ssh -t [email protected] '. /tmp/.bashrc; ash' ~ # echo $0 ash ~ # alias ~ #
不过我现在可以. /tmp/.bashrc
手动运行,而且效果很好。请注意,在有效的采购之后,我有一个改进的提示字符串和新的别名:
~ # . /tmp/.bashrc ash: /tmp/.bashrc: line 16: shopt: not found ash: /tmp/.bashrc: line 24: shopt: not found ash: /tmp/.bashrc: line 111: shopt: not found root@device:~# alias l='ls -CF' alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '"'"'s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'"'"')"' la='ls -A' ll='ls -alF'
您还会看到第 16、24 和 111 行由于shopt
未找到而出现的 ash 错误。即使我在发送的 .bashrc 文件中注释掉这些内容,上面显示的结果仍然是相同的。
我怎样才能让上面的命令起作用?我希望它能通过 ssh 进入,将 shell 设置为更像 bash 的东西,然后获取/tmp/.bashrc
我 scp 过来的文件。
在类似的嵌入式设备上做有bash
安装了,这个cmd运行完美,正如我在我的仓库中记录的那样:
sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp \
&& sshpass -f ~/pw ssh -t [email protected] 'bash --rcfile /tmp/.bashrc'
对于bash
,bash --rcfile /tmp/.bashrc
在 ssh cmd 末尾使用是我所需要的。但是,对于没有 OUT 的设备bash
,我需要帮助获得此行为ash
或类似的行为。
答案1
你为何跑ash
?具有 busybox 的系统不太可能有两个不同的 shell。 (从技术上讲,这可能/bin/sh
与 不同/bin/ash
,但在嵌入式设备上这是一个非常不可能的设置。)
除了一些简单的别名或函数之外,很少有典型内容.bashrc
可以在 ash(或任何非 bash 的 shell)中工作。不起作用的内容包括shopt
键绑定、提示设置、任何使用非 POSIX 扩展的函数、引用嵌入式设备上不存在的命令的任何别名。
… ssh -t [email protected] '. /tmp/.bashrc; ash'
您正在/tmp/.bashrc
原始 shell 中读取,然后运行不同的 shell 程序。该不同程序不会继承任何 shell 的内部设置(例如别名)。这与ssh,启动特定的 shell,并在远程计算机上运行命令?这是关于读取的.profile
,它设置了环境变量,是遗传。
$ENV
BusyBox的ash交互启动时会从名字所在的文件中读取命令。 (BusyBox 的 sh 可以是 ash 或 hush;既然你有一个ash
命令,你的就是 ash。)所以你可以设置ENV
为你想要读取命令的文件的名称。
… ssh -t [email protected] 'export ENV=/tmp/.bashrc; sh -i'
答案2
您的默认 shell 存储在该/etc/passwd
文件中。任何用户都可以使用该chsh
命令更改其默认 shell。授权的 shell 列在 中/etc/shells
。当然,在切换到此 shell 之前,应该存在 bash。