这是这个问题的一种后续问题:ssh,启动特定的shell,并在远程机器上运行命令?, 除了更具体地关于ash
, 并专注于采购 .bashrc 文件作为在 ssh 会话中启动 shell 的一部分对我不起作用的事实。
我在一个嵌入式 Linux 设备上,它有一个 busybox 版本的sh
and ash
,但没有bash
. 我们共享一个共同的用户名 ( root
) 和一个共同的执行环境。
但是,我想要一些自定义别名和自定义PS1
Prompt String 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-ing 的 Ubuntu 机器上)复制到设备,/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 ,但 source 不起作用。
$ 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'
shopt
由于未找到,您还会看到第 16、24 和 111 行的 ash 错误。即使我在发送过来的 .bashrc 文件中将它们注释掉,如上所示的结果仍然相同。
我怎样才能让我的上述命令工作?我希望它可以通过 ssh 进入,将 shell 设置为更像 bash 的东西,然后/tmp/.bashrc
获取我的 scp'ed 文件。
在已安装的类似嵌入式设备上,bash
此 cmd 运行良好,正如我在我的 repo 中记录的那样:
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
或类似行为。
你为什么要跑步
ash
?带有busybox 的系统不太可能有两个不同的shell。(从技术上讲,它可能/bin/sh
与 .shell 不同/bin/ash
,但它在嵌入式设备上的设置非常不可能。)除了一些简单的别名或函数之外,很少有典型内容
.bashrc
可能在 ash(或任何非 bash 的 shell)中工作。不起作用的东西包括shopt
,键绑定,提示设置,任何使用非 POSIX 扩展的函数,任何引用嵌入式设备上不存在的命令的别名。您正在阅读
/tmp/.bashrc
原始 shell,然后运行不同的 shell 程序。那个不同的程序不会继承任何 shell 的内部设置,例如别名。与 ssh 完全不同的问题,启动特定的 shell,然后在远程机器上运行命令?这是关于阅读.profile
的,它设置了继承的环境变量。$ENV
BusyBox 的 ash 在交互启动时从名称所在的文件中读取命令。(BusyBox 的 sh 可以是 ash 或 hush;既然你有ash
命令,你的就是 ash。)所以你可以设置ENV
为你想读取命令的文件名。您的默认 shell 存储在
/etc/passwd
文件中。chsh
任何用户都可以使用该命令更改其默认 shell 。授权的 shell 列在/etc/shells
. 当然,在切换到这个 shell 之前应该存在 bash。