記錄一奇葩scp問題的分析與解決過程

2021-12-29 21:08:07 字數 3518 閱讀 8380

引 入

linux是乙個龐大複雜的系統。整天跟它打交道的運維或開發人員難免不遇到什麼問題。這裡,本人聊聊遇到的乙個跟scp相關的奇葩問題。

一、問題描述

兩台centos6.7主機(主機一:172.16.13.62和主機二:172.16.13.72),都安裝好ssh,相關的ssh連線配置也沒問題,但是在用scp進行兩主機之間的檔案傳輸複製時,出現以下情況:

在主機一上操作scp,成功從主機二傳輸檔案到主機一。當然也能成功把檔案從主機一成功傳輸到主機二。如:

[[email protected]~]#scp172.16.13.72:/root/20160215.log/root

[email protected]'spassword:

20160215.log100%34343.4kb/s00:00

[[email protected]~]#

而在主機二上操作scp,做從主機一傳輸檔案到主機二時,成功輸入密碼後,出現如下情況:

[[email protected]~]#scp172.16.13.62:/root/20160215.log/root

[email protected]'spassword:

---------changealiashere-----------

[[email protected]~]#

列印了一句"changealiashere",然後就結束了,scp沒有成功傳輸檔案。當然從主機二傳輸檔案到主機一的時候,依舊也是列印一句"changealiashere",傳輸也是沒有成功的。

為什麼在主機一上操作scp成功,而在主機二上操作卻不成功呢?那句"changealiashere"又是從**來的呢?我做出了以下分析:

二、分析解決

以下分析中,主機二也叫錯誤主機,主機一成為正確主機。

步驟:1) 通過scp -v檢視錯誤主機的debug詳細資訊

從debug中可以看出這次scp的執行的結果狀態是有錯誤的,但是不容易發現錯誤點在哪,所以我在正確主機上也debug來對比分析。

2) 對比正確主機分析錯誤

從debug中可以看出這次scp的執行的結果狀態是有正確的。對比過後分析後可以大概把錯誤點定位在"send file modes 跟sink"這兩個入口。

3) 分析出現"changealiashere"的地方

由於發現"changealiashere"是在非互動式登入時就會出現,故很快可以找出"changealiashere"的所在地。即:~/.bashrc

發現原來是前面為了標識一下可以在~/.bashrc中定義命令別名而加上的一句echo回顯列印。把相關的echo刪除後可以發現scp可以正常操作,問題解決。

4) 回頭分析錯誤出現深一步原因

多乙個echo就會出現scp錯誤?通過查閱各種相關資料得知,基於ssh的scp命令的工作模式主要有source mode跟sink mode兩種,建立連線後。

如果請求方接收到的第乙個字元不是大寫字元"c",如上面例子的"---------changealiashere-----------"。則會由於這遠端shell的配置檔案輸出「加入」的協議會話而退出了scp。

如果請求方接收到的第乙個字元是大寫字元"c",如"c0644 333420160215.log",你就會發現乙個有趣的情況,scp程式將會成功讀取3334個位元組,20160215.log檔案剩下的位元組將會在螢幕顯示出來。

[[email protected]~]#scp172.16.13.62:20160215.log.

[email protected]'spassword:

20160215.log100%33343.3kb/s00:00

6/index.php""mozilla/5.0(windowsnt6.1;wow64)applewebkit/537.36(khtml,likegecko)chrome/47.0.2526.80safari/537.36"

[[email protected]~]#

而讀取到的20160215.log檔案裡面,會包含「c0644333420160215.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相關的奇葩問題,不要乙個人留著哦,期待與您一起討論分享。

XML解析中Bom導致錯誤的問題分析與解決

nested exception content is not allowed in prolog.xml編碼錯誤 左邊報錯的xml,右邊正常的xml檔案,比較工具beyond compare 4 2 對於webservice接收來的xmlstring的處理,使用如下方法,修改xml字串 檢查xml...

輿情分析與影響的經驗記錄一

1.先講下httpwebrequest的使用。關於httpwebrequest的使用,網上一搜就是一大堆。我這要寫的主要是我自己使用的經驗。我就一直在找原因,使用除錯一步一步的走,但是都沒有問題。隨後我又想是不是發帖的速度太快了,就加了thread.sleep 來減緩下發帖的速度。結果還是不行。最後...

一維陣列解01揹包問題(總結各種大神的分析)

經歷過拼多多的筆試題,就知道該多學學動態規劃演算法了。問題描述 有n和重量和價值分別為wi,vi的物品,從這些物品中挑選出總質量不超過c的物品,如何挑選使得總價值量最大?思路分析 序號 weight value12 3456 78910 a250 5588 1313 141616b 3301 388...