2014-12-30 72 views
1

我正在编写一个bash脚本,它检查文件名列表,并尝试使用scp从两台服务器将每个文件复制到本地文件夹中。该脚本然后将本地文件相互比较。但有时候,文件不会存在于一台服务器或另一台服务器上,或者两者都存在。SCP的实际返回码

起初,我用这个代码:

scp [email protected]$host:/etc/$file ./$host/conf/ 2>/tmp/Error 1>/dev/null 
error=$(</tmp/Error) # error catching 
if [[ -n "$error" ]]; then echo -e "$file not found on $host"; fi 

但我发现,一些(企业)服务器输出(法律术语)消息(标准错误我猜)每个用户通过scpssh连接时间。所以我开始研究利用exit codes

我可以简单地使用

scp [email protected]$host:/etc/$file ./$host/conf/ 2>/tmp/Error 1>/dev/null 
if [[ $? -ne 0 ]]; then echo -e "$file not found on $host"; fi 

但自从exit code for "file does not exist" is supposed to be 6,我宁愿有一个更精确的

scp [email protected]$host:/etc/$file ./$host/conf/ 2>/tmp/Error 1>/dev/null 
if [[ $? -eq 6 ]]; then echo -e "$file not found on $host"; fi 

的问题是,我似乎不管有愈演愈烈的退出代码为1什么地方出了错。这个问题与this one类似,但是这个答案在Bash中帮不了我。

我正在考虑另一种方案是

scp [email protected]$host:/etc/$file ./$host/conf/ 2>/tmp/Error 1>/dev/null 
error=$(</tmp/Error) # error catching 
if [[ ${error: -25} = "No such file or directory" ]]; then echo -e "$file not found on $host"; fi 

但我关心的是不同版本的scp可能会对相同的错误不同的错误消息。

有没有办法让scp在Bash脚本中的实际退出码?

+0

使用'case'语句的代码我得到:'$的情况下? in(0)echo ok ;; (6)echo“找不到文件”;; (*)回声“别的东西”;; esac'。或者将返回代码保存在一个变量中:'ret_code = $?'。作为一个方面说明:不要使用'scp',这很糟糕。改用'rsync'或'sftp'代替。 –

+0

要清楚从'scp'得到的返回码与它在本地机器上的状态有关;它不会通过正在复制的远程计算机的返回代码。因此,如果主机不存在或凭据失败,它将具有非零的退出代码。也许这很清楚,如果是这样,就忽略评论。 –

+0

@gniourf_gniourf正在表达我的意思,除了我会使用'rsync'时期。我的经验是'scp'不如'sftp'! ;-)当我不得不在多个操作系统之间进行“ftp”操作时,我有一个知道每个操作系统的ftp错误信息的功能并相应地执行了操作。 另外,在足够的操作系统上没有使用'rsync'来知道错误消息是否一致。我认为应该是,但是......如果它必须是防弹的,假设最差,并且在开发过程中专门测试每个案例。祝你好运! – shellter

回答

2

根据意见(@gniourf_gniourf,@shelter,@Wintermute)我决定简单地将工具切换到rsync。谢天谢地,语法不需要改变。

23是错误代码时不存在文件,所以这里是我结束了

rsync -q [email protected]$host:/etc/$file ./$host/conf/ 2>/tmp/Error 1>/dev/null 
if [[ $? -eq 23 ]]; then echo -e "$file not found on $host"; continue; fi 
0

我看到1找不到“找不到文件”,如果您需要区分不同的错误捕获标准输出,可以针对本地主机测试这些类型的东西。

if $err=`scp $host:$file 2>&1` 
then 
    echo "copied successfully 
else 
case "$err" in 
    *"file not found"*) 
    echo "$file Not Found on $host" 
    ;; 
    *"Could not resolve hostname"*) 
    echo "Host not found: $host" 
    ;; 
    "Permission denied "*) 
    echo "perm-denied! $host" 
    ;; 
    *) 
    echo "other scp error $err" 
    ;; 
esac 

如果您的不同语言环境具有不同的消息,则这不起作用。

+0

我的问题是试图从'scp'获得可靠的退出状态,因为我们都提到我不能依赖基于正则表达式的错误输出。事实上,你列出的案例陈述(“找不到文件”)不会找到我所看到的错误陈述,即“没有这样的文件或目录”。 – NoOutlet