记录一奇葩scp问题的分析与解决过程

引 入



linux是一个庞大复杂的系统。整天跟它打交道的运维或开发人员难免不遇到什么问题。这里,本人聊聊遇到的一个跟scp相关的奇葩问题。


一、问题描述



两台centos6.7主机(主机一:172.16.13.62和主机二:172.16.13.72),都安装好ssh,相关的ssh连接配置也没问题,但是在用scp进行两主机之间的文件传输复制时,出现以下情况:

在主机一上操作scp,成功从主机二传输文件到主机一。当然也能成功把文件从主机一成功传输到主机二。如:

[[email protected] ~]#scp 172.16.13.72:/root/20160215.log /root
[email protected]‘s password: 
20160215.log                                     100% 3434     3.4KB/s   00:00    
[[email protected] ~]#

而在主机二上操作scp,做从主机一传输文件到主机二时,成功输入密码后,出现如下情况:

[[email protected] ~]#scp 172.16.13.62:/root/20160215.log /root
[email protected]‘s password: 
---------change alias here-----------
[[email protected] ~]#

打印了一句"change alias here",然后就结束了,scp没有成功传输文件。当然从主机二传输文件到主机一的时候,依旧也是打印一句"change alias here",传输也是没有成功的。

为什么在主机一上操作scp成功,而在主机二上操作却不成功呢?那句"change alias here"又是从哪里来的呢?我做出了以下分析:

二、分析解决



以下分析中,主机二也叫错误主机,主机一成为正确主机。

步骤:

1) 通过scp -v查看错误主机的debug详细信息

[[email protected] ~]#scp -v 172.16.13.62:/root/20160215.log /root

从debug中可以看出这次scp的运行的结果状态是有错误的,但是不容易发现错误点在哪,所以我在正确主机上也debug来对比分析。

2) 对比正确主机分析错误

[[email protected] ~]#scp -v 172.16.13.72:/root/20160215.log /root

从debug中可以看出这次scp的运行的结果状态是有正确的。对比过后分析后可以大概把错误点定位在"Send file modes 跟Sink"这两个入口。

3) 分析出现"change alias here"的地方

由于发现"change alias here"是在非交互式登录时就会出现,故很快可以找出"change alias here"的所在地。即:~/.bashrc

发现原来是前面为了标识一下可以在~/.bashrc中定义命令别名而加上的一句echo回显打印。把相关的echo删除后可以发现scp可以正常操作,问题解决。

4) 回头分析错误出现深一步原因

多一个echo就会出现scp错误?通过查阅各种相关资料得知,基于ssh的scp命令的工作模式主要有source modesink mode两种,建立连接后。

如果请求方接收到的第一个字符不是大写字符"C",如上面例子的"---------change alias here-----------"。则会由于这远端shell的配置文件输出“加入”的协议会话而退出了scp。

如果请求方接收到的第一个字符是大写字符"C",如"C0644 3334 20160215.log",你就会发现一个有趣的情况,scp程序将会成功读取3334个字节,20160215.log文件剩下的字节将会在屏幕显示出来。

[[email protected] ~]# scp 172.16.13.62:20160215.log  .
[email protected]‘s password: 
20160215.log              100% 3334     3.3KB/s   00:00    
6/index.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
[[email protected] ~]#

而读取到的20160215.log文件里面,会包含“C0644 3334 20160215.log”这句echo打印的话。

是不是挺有意思呢?

由于问题已经解决,自己又没很大决心再往细细去研究这SCP的工作原理,所以我的分析就到此为止了。想深入了解SCP原理的朋友可以参考How the SCP protocol works这篇文件,写得还不错。

三、补充:bash的配置文件类型



主要可以分为两类:

profile类:为交互式登录的shell进程提供配置

bashrc类:为非交互式登录的shell进程提供配置

全局:对所有用户都生效 用户个人:仅对当前用户有效 功用
profile类
/etc/profile 或 /etc/profile.d/*.sh

~/.bash_profile
1、定义环境变量;

2、运行命令或脚本

bashrc类 /etc/bashrc  ~/.bashrc
1、定义本地变量;

2、定义命令别名;

登录类型:

交互式登录shell进程:

直接通过某终端输入账号和密码后登录打开的shell进程;

使用su命令:su - USERNAME, 或者使用 su -l USERNAME执行的登录切换;

非交互式登录shell进程:

su USERNAME执行的登录切换;

图形界面下打开的终端;

运行脚本

配置文件读取顺序:

交互式登录shell进程:

/etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互式登录shell进程:

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*

结 语



发现问题不可怕,解决问题时,分析思路最重要。

如果朋友你自己也有linux相关的奇葩问题,不要一个人留着哦,期待与您一起讨论分享。

附:如对上面描述有疑问,期待与朋友您共同探讨。本人QQ:1084569767

时间: 2024-10-26 05:56:36

记录一奇葩scp问题的分析与解决过程的相关文章

启动Tomcat一闪而过——分析及解决过程

转自http://www.cnblogs.com/godtrue/p/4339045.html 启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的Servlet/JSP容器,其主要功能是用于发布JavaWeb应用. 更多的信息请参看: http://tomcat.apache.org/ 2:怎么选择Tomcat的版本 规则是看我们选择使用的技术是什

记录一则Spark读写和Lost Excutor错误的分析和解决过程

一.概述 上篇blog记录了些在用spark-sql时遇到的一些问题,今天继续记录用Spark提供的RDD转化方法开发公司第一期标签分析系统(一部分scala作业逻辑代码后面blog再给大家分享)遇到的一些SPARK作业错误信息.其中有些问题可能一些数据量或者shuffle量比较小的作业时不会遇到的,我们整套标签系统的初级输入数据大概是8T左右,这里也是个参考.(下面的Spark部署模式为spark on yarn) 二.问题 1.大规模数据往HDFS中写时候,报了HDFS读写超时,具体日志看下

记录 Ext 日历月份选择控件bug解决过程结果

目录 背景 代码 背景 项目使用 Ext.NET 2.2.0.40838 , 对应 Ext JS4.2 版本. 结果 2017/3/31 号的时候偶然间点日历选择控件选择2月,10月等月份突然就跳到3月份,9月份之类. 就是无法选择, 选择谷歌以后发现有同样的问题, 然后各种尝试, 重写了默认属性,如下代码后解决. 收获就是调用平台有时候要知道原因才能找到未知原因并修复. 宝贵的额是Ext框架问题解决思路吧. 现记录. 改动的部分就是 dt.setDate(1); 这一句, 设置为当前月份第一天

记录一次Qt5程序无法运行的解决过程

上几天在V站逛的时候看到某作者出了个截图工具(snipaste)很是强大. 可下载后就是打不开, 工具是Qt5写的, 提示我无法加载qwindows.dll, 这个dll明确在platforms目录里放着的. 谷歌一通后发现Qt的社区有个帖子也是这样, 那人用Dependency Walker列出了程序加载的dll, 而且其中一个dll路径明显是本机某个特殊路径. 我在想是不是因为我安装了Qt的SDK的原因.经过Dependency Walker查看, 果然是. 本来该加载应用程序目录下的qwi

记录bsh for scp 发布文件用法

for ip in 102 103 104 111 112 113 114 115 116 121 122; do sudo scp /etc/sudoers [email protected]$ip:/etc/sudoers ;done 记录bsh for scp 发布文件用法

TCP粘包问题分析和解决(全)

TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小.数据量小的数据,合并成一个大的数据块,然后进行封包.这样,接收端,就难于分辨出来了,必须提供科学的拆包机制. 对于UDP,不会使用块的合并优化算法,这样,实际上目前认为,是由于UDP支持的是一对多的模式,

Cocos2D v3.4.9粒子效果不能显示的原因分析及解决办法

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在游戏App中为了衬托气氛我们往往使用一些特殊的图形效果,粒子效果无疑是其中最为常用,也最为方便的一种. 正常使用下,粒子效果的确很稳定,但是本猫最近在RPG游戏里却遇到了粒子效果不能显示的问题,调试着实花了一些功夫.现将问题现象,分析以及解决方法记录下来和大家一起分享,也便于以后回忆查找. 问题现象很简单,就是粒子效果不显示-但也不是所有粒子效果都不显示,只

[转]线上GC故障解决过程记录

排查了三四个小时,终于解决了这个GC问题,记录解决过程于此,希望对大家有所帮助.本文假定读者已具备基本的GC常识和JVM调优知识,关于JVM调优工具使用可以查看我在同一分类下的另一篇文章: http://my.oschina.net/feichexia/blog/196575 背景说明 发生问题的系统部署在Unix上,发生问题前已经跑了两周多了. 其中我用到了Hadoop源码中的CountingBloomFilter,并将其修改成了线程安全的实现(详情见:AdjustedCountingBloo

MySQL死锁问题实例分析及解决方法

MySQL死锁问题的相关知识是本文我们主要要介绍的内容,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助. 1.MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level locking)或表级锁,默认为页面锁 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 2.各种锁特点 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低 行级锁