使用命令行时,它通常会变得非常混乱。例如,检查过去的命令及其输出变得不方便。
我希望每次在显示命令提示符之前都添加一个换行符。像这样:
<clutter>
<blank line>
name@machine:~$
Run Code Online (Sandbox Code Playgroud)
我使用 bash 外壳。如何做到这一点?
我刚刚完成了OverTheWire Bandit 兵棋推演,等级 18。
那是一个惊喜。以下是此级别的说明。
下一级的密码存储在主目录的自述文件中。不幸的是,当您使用 SSH 登录时,有人修改了.bashrc以将您注销。
我在想一种让 shell 跳过 sourcing 的方法.bashrc。但在我找到解决方案之前,我很想简单地启动与服务器的 SFTP 连接。我没想到它会起作用。但它做到了。我想知道为什么。我认为 SFTP 通过 SSH 运行。
为清楚起见,当我通过 SSH 连接到服务器时,正如预期的那样,我被踢了出去。
我已经安装jailkit上Ubuntu 12.04,我已经建立了一个用户的shell来/bin/bash-但是当它被调用运行/etc/bash.bashrc,而不是/etc/profile
如果您以前没有使用jailkit过这里是它的要点:
所以我有一个testuser这样的条目/etc/passwd:
testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh
Run Code Online (Sandbox Code Playgroud)
在文件中/home/jail/etc/passwd有一个条目,如:
testuser:1001:1003::/home/testuser:/bin/bash
Run Code Online (Sandbox Code Playgroud)
我已经阅读了bash(1),所以我认为问题在于 bash 认为它没有被作为登录 shell 调用:
当 bash 作为交互式登录 shell 或作为具有 --login 选项的非交互式 shell 调用时,它首先从文件 /etc/profile 读取并执行命令(如果该文件存在)。
我知道这bash实际上是被调用的,/usr/sbin/jk_chrootsh但我不明白如何bash确定它是什么类型的外壳,以及它应该运行哪组启动文件。
我想看看我是否可以解决这个问题 - 但我不明白:
ps:我也看了,login(1)运气不好。
我错误地.bash_profile在bashrc文件中有源,反之亦然。现在,当我尝试通过 ssh 进入机器 (ec2) 时,它会卡在加载 bash 并在一秒钟内关闭连接。有什么办法可以修复它吗?我可以将磁盘挂载到另一个 ec2 实例来修复 bash 文件吗?
更新 1:我尝试了以下操作:
% ssh -i "my-pem.pem" -t ubuntu@<server_address>.amazonaws.com "/bin/bash --noprofile --norc"
Connection to <server_address>.amazonaws.com closed.
Run Code Online (Sandbox Code Playgroud)
其他什么都没有出现。你知道出了什么问题吗?
对于健全性检查,如果我这样做ssh -i "my-pem.pem"ubuntu@<server_address>.amazonaws.com,消息将是
...
28 packages can be updated.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable
New release '20.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Last login: Mon Feb 22 23:17:41 2021 from ip
Connection to …Run Code Online (Sandbox Code Playgroud) 在我学习非交互式登录 shell 的过程中,我遇到了 2 种通过 SSH 远程执行命令的方法。对我来说,它们看起来都是一样的。但不幸的是,他们不是。
使用命令echo "shopt login_shell; echo \$-" | ssh -l poweruser 192.168.1.67,我得到以下输出。
Pseudo-terminal will not be allocated because stdin is not a terminal.
poweruser@192.168.1.67's password:
login_shell on
hBs
Run Code Online (Sandbox Code Playgroud)
但是使用命令ssh -l poweruser 192.168.1.67 "shopt login_shell; echo \$-",我得到了不同的输出。
poweruser@192.168.1.67's password:
login_shell off
hBc
Run Code Online (Sandbox Code Playgroud)
你能告诉我为什么在第二种情况下 shell 不是登录 shell,即使它提示输入密码。
对于 Docker 容器,我们使用 Alpine Linux,例如 Node:Alpine,以使我们的镜像尽可能小。但有时您想登录该容器。将您的别名放在该容器中会很方便。
当我们使用标准 Linux 时,我们将 .bashrc 映射到 /root/.bashrc 并让所有别名可用。
但我找不到 Alpine Linix 的 .bashrc 等效项。
我试过了:
全部不工作。
Alpine Linux 在 Docker 容器中启动。
FROM node:alpine
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/build .
Run Code Online (Sandbox Code Playgroud)
我从主机(我的 OSX macbook)使用以下命令
FROM node:alpine
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/build .
Run Code Online (Sandbox Code Playgroud)
docker exec -it <containerName> /bin/sh
Run Code Online (Sandbox Code Playgroud)
启动容器:
jobrunner:
build:
context: ./build
dockerfile: Dockerfile
image: jobrunner:1.0
volumes:
- ./deployment/jobs/root/.bashrc:/root/.bashrc
- ./deployment/jobs/root/.bashrc:/root/.profile
- …Run Code Online (Sandbox Code Playgroud) 我有一个设备/var/iot/data,我试图在其中远程获取数据。
在机器本身上:
# cat /var/iot/data | xxd -ps -c 32
80de004a030270055678013ac591e5c6abac2185f4319c8088e3
Run Code Online (Sandbox Code Playgroud)
那是正确的数据。
如果我远程运行相同的东西,它看起来是正确的:
$ ssh -T -x dragino 'cat /var/iot/data | xxd -ps -c 32'
80de004a030270055678013ac591e5c6abac2185f4319c8088e3
Run Code Online (Sandbox Code Playgroud)
但它实际上带有一堆转义序列:
$ ssh -T -x dragino 'cat /var/iot/data | xxd -ps -c 32' | xxd
00000000: 1b5d 3131 3b23 3138 3464 3666 0738 3064 .]11;#184d6f.80d
00000010: 6530 3034 6130 3330 3237 3030 3535 3637 e004a03027005567
00000020: 3830 3133 6163 3539 3165 3563 3661 6261 8013ac591e5c6aba
00000030: 6332 3138 3566 3433 3139 6338 …Run Code Online (Sandbox Code Playgroud) 我对 shell 脚本编写比较陌生,所以如果这看起来是一个简单的问题,我深表歉意。我有一个 Linux VM ( debian, version 11 (bullseye)),我可以通过 ssh 进入 ( ssh <ip>),安装了一些依赖项(homebrew、pyenv 等),并且能够成功使用它们。ssh <user>@<ip> pyenv versions但是,当我尝试在脚本中或使用 Mac 终端从 VM ( ) 外部运行命令时,会收到bash: line 1: pyenv: command not found相关错误。
我认为这可能与此处解释的内容有关,但我不完全确定如何规避该问题。
在下面的评论中添加@terdon 询问的其他详细信息:
$ which pyenv
/home/linuxbrew/.linuxbrew/bin/pyenv
$ grep /home/linuxbrew/.linuxbrew/bin/ ~/.bashrc ~/.bash_profile ~/.profile /etc/bash.bashrc /etc/profile
grep: /home/f0p021s/.bash_profile: No such file or directory
/home/f0p021s/.profile:eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
Run Code Online (Sandbox Code Playgroud)
我还意识到,如果我从虚拟机中查看路径,它看起来像这样:
$ echo $PATH
/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Run Code Online (Sandbox Code Playgroud)
当我尝试从本地计算机运行类似的命令时,它看起来有所不同:
$ ssh <user>@<ip> 'echo $PATH'
/usr/local/bin:/usr/bin:/bin:/usr/games
Run Code Online (Sandbox Code Playgroud) 当通过旧的 Bourne shell ( sh)登录到 Linux/Unix 系统时,我们.profile有为我们定制环境的文件。一些来源还引用.shinit文件或.shrc文件。什么时候适合使用其中之一,它们之间有什么区别?
根据什么是登录和非登录 shell的答案?在 Ask Ubuntu 上,GNOME 终端是一种非登录 shell。正如优秀著作《Fedora 和 Red Hat Enterprise Linux 实用指南,第 6 版》中所指出的:
交互式非登录 shell 执行 ~/.bashrc 文件中的命令。默认的 ~/.bashrc 文件调用 /etc/bashrc。
因此,/etc/profile不会在非登录 shell 中处理。但是,我发现我已将 java 主路径附加到PATH
变量,并且当我使用 GNOME 终端并发出命令时java,一切正常。此外,PATH变量的值与我在/etc/profile.
鉴于上述事实,存在冲突,我的理解有什么问题?
bash ×6
ssh ×4
login ×3
shell ×3
alpine-linux ×1
amazon-ec2 ×1
command-line ×1
debian ×1
docker ×1
jails ×1
scripting ×1
sftp ×1
startup ×1
terminal ×1
ubuntu ×1