一段时间以来,我一直在经历 SCP 非常奇怪的行为:每当我尝试复制文件时,SCP 的输出都包含一堆下划线,并且文件没有被复制。
$ scp test.txt 192.168.0.2:~
job@192.168.0.2's password:
________________________________________
Run Code Online (Sandbox Code Playgroud)
当我使用 Midnight Commander 创建 SSH 连接并复制文件时,它确实有效。
关于我的机器的一些信息:
$ ssh -V
OpenSSH_5.8p1 Debian-1ubuntu3, OpenSSL 0.9.8o 01 Jun 2010
$ uname -a
Linux squatpc 2.6.38-10-generic #46-Ubuntu SMP Tue Jun 28 15:05:41 UTC 2011 i686 i686 i386 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
我正在运行 Kubuntu 11.04。
编辑:根据评论的要求提供更多信息:
$ scp -v test.txt 192.168.0.2:~
Executing: program /usr/bin/ssh host 192.168.0.2, user (unspecified), command scp -v -t -- ~
OpenSSH_5.8p1 Debian-1ubuntu3, OpenSSL 0.9.8o 01 Jun 2010
debug1: Reading configuration data …
Run Code Online (Sandbox Code Playgroud) 我错误地.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) 据我了解,守护进程是后台进程,但守护进程需要唯一的配置文件来设置环境变量。
例如,Hadoop守护进程需要hadoop-env.sh来设置环境变量JAVA_HOME
,你不能简单地从中获取变量~/.bashrc
。
原因是因为守护进程作为后台进程意味着它是非交互式的,而 ~/.bashrc 意味着仅在交互式会话中使用,以防止出现alias cp='cp -i'
case。
最新的~/.bashrc
文件顶部有安全防护不允许非交互式调用者,即没有-i
选项将提前返回:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Run Code Online (Sandbox Code Playgroud)
这让我想知道为什么 bashrc 不将配置文件分为 3 组,例如:
~/.bashrc_interactive
~/.bashrc_non_interactive
~/.bashrc_global #(交互式和非交互式)
因此用户只需JAVA_HOME
在~/.bashrc_non_interactive
或中设置即可~/.bashrc_global
,无需在每个守护程序文件中一遍又一遍地添加此环境变量。
是否有任何原因或限制 bashrc 不支持这种方式或任何其他方式的非交互式?或者我误解了一些概念?
我正在尝试将文件从本地机器传输到远程机器。
当我scp
不带-v
选项使用时,它只提供以下输出:
.--. or '\033[0;1;33;93m.-\033[0;1;32;92m-.\033[0m'
Run Code Online (Sandbox Code Playgroud)
当我尝试scp
使用-v
选项时,我得到以下输出,似乎文件传输成功:
——
$ scp -v file.sh user@IP:/home/user/foo
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: Sending environment.
debug1: Sending env LC_PAPER = tr_TR.UTF-8
debug1: Sending env LC_ADDRESS = tr_TR.UTF-8
debug1: Sending env LC_MONETARY = tr_TR.UTF-8
debug1: Sending env LC_NUMERIC = tr_TR.UTF-8
debug1: Sending env LC_ALL = en_US.UTF-8
debug1: Sending env LC_TELEPHONE = tr_TR.UTF-8
debug1: Sending env LC_IDENTIFICATION = tr_TR.UTF-8 …
Run Code Online (Sandbox Code Playgroud) 我刚刚更新了 Cygwin,新的.bashrc
在顶部包含这一行:
echo "BEFORE TEST"
# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return
echo "AFTER TEST"
Run Code Online (Sandbox Code Playgroud)
我明白如果不运行交互式,你不需要做任何事情,但我的问题是,如果我ssh
使用命令:
ssh localhost pwd
Run Code Online (Sandbox Code Playgroud)
我看到这个:
BEFORE TEST
Run Code Online (Sandbox Code Playgroud)
所以,很明显,它没有通过[[ "$-" != *i* ]]
测试并返回。显然ssh localhost pwd
是一个微不足道的例子,但我希望.bashrc
如果通过ssh
. 我的实际自动化针对这个 cygwin 实例远程运行命令并且失败,因为路径(由 my 设置.bashrc
)没有正确设置。
此外,任何人都可以解释该测试实际上在做什么吗?什么是i
?什么是$-
应该代表什么?
我正在尝试使用 scp 从网络中的另一台计算机复制一个小文件,该计算机运行的是 Linux Mint 18.3。
我从 macOS 尝试过,我得到了这个:
$ scp fyde@192.168.1.211:/home/fyde/Downloads/notes/ubuntu.txt .
fyde@192.168.1.211's password:
\033]4;0;#2b1229\033\\033]4;1;#FFD36D\033\\033]4;2;#6559B6\033\\033]4;3;#E1549E\033\\033]4;4;#788FA3\033\\033]4;5;#778BE1\033\\033]4;6;#D88AA7\033\\033]4;7;#d2d8d2\033\\033]4;8;#939793\033\\033]4;9;#FFD36D\033\\033]4;10;#6559B6\033\\033]4;11;#E1549E\033\\033]4;12;#788FA3\033\\033]4;13;#778BE1\033\\033]4;14;#D88AA7\033\\033]4;15;#d2d8d2\033\\033]10;#d2d8d2\033\\033]11;#2b1229\033\\033]12;#FFD36D\033\\033]13;#d2d8d2\033\\033[s\033[1000H\033[8m\033]708;#2b1229\033\\033[u\033]13;#d2d8d2\033\C0644 6743 ubuntu.txt
Run Code Online (Sandbox Code Playgroud)
我在 Ubuntu 机器上尝试过,但得到了类似的结果:
$ scp fyde@192.168.1.211:/home/fyde/Downloads/notes/ubuntu.txt .
fyde@192.168.1.211's password:
C0644 6743 ubuntu.txt
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的文件,得到了相同的结果,从其他计算机复制工作正常。
有谁知道发生了什么?
scp ×3
bash ×2
ssh ×2
amazon-ec2 ×1
bashrc ×1
cygwin ×1
daemon ×1
history ×1
interactive ×1
sshd ×1