我正在编写一个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
但我发现,一些(企业)服务器输出(法律术语)消息(标准错误我猜)每个用户通过scp
或ssh
连接时间。所以我开始研究利用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脚本中的实际退出码?
使用'case'语句的代码我得到:'$的情况下? in(0)echo ok ;; (6)echo“找不到文件”;; (*)回声“别的东西”;; esac'。或者将返回代码保存在一个变量中:'ret_code = $?'。作为一个方面说明:不要使用'scp',这很糟糕。改用'rsync'或'sftp'代替。 –
要清楚从'scp'得到的返回码与它在本地机器上的状态有关;它不会通过正在复制的远程计算机的返回代码。因此,如果主机不存在或凭据失败,它将具有非零的退出代码。也许这很清楚,如果是这样,就忽略评论。 –
@gniourf_gniourf正在表达我的意思,除了我会使用'rsync'时期。我的经验是'scp'不如'sftp'! ;-)当我不得不在多个操作系统之间进行“ftp”操作时,我有一个知道每个操作系统的ftp错误信息的功能并相应地执行了操作。 另外,在足够的操作系统上没有使用'rsync'来知道错误消息是否一致。我认为应该是,但是......如果它必须是防弹的,假设最差,并且在开发过程中专门测试每个案例。祝你好运! – shellter