ssh,启动特定的 shell (ash),并在远程计算机上获取您的环境

ssh,启动特定的 shell (ash),并在远程计算机上获取您的环境

这是这个问题的后续问题:ssh,启动特定的 shell,并在远程计算机上运行命令?,除了更具体地关于ash,并重点关注以下事实:在 ssh 会话中启动 shell 时获取 .bashrc 文件对我来说不起作用。

我使用的是嵌入式 Linux 设备,该设备有 busybox 版本的shash,但没有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'

对于bashbash --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,它设置了环境变量,遗传。

$ENVBusyBox的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。

相关内容