Bash:`sshpass`命令在嵌套while循环中无法正常工作

时间:2019-07-29 06:48:36

标签: bash

我对bash脚本完全陌生。我正在尝试编写bash脚本,以将文件从登台复制到多个生产服务器。

我正在使用三个文件。

  1. serverPass.txt:包含多个服务器ip及其密码(以空格分隔)。

  2. paths.txt:包含需要在serverPass.txt

  3. 中提到的每个服务器上复制文件的路径。
  4. copy.sh:bash脚本文件。

copy.sh:

#!/bin/bash
 while read SERVER PASSWORD;
 do
     while read PATH;
     do
         sshpass -p "$PASSWORD" scp * "$SERVER":"$PATH"
     done <./paths.txt  
 done <./serverPass.txt

我得到的输出是:

sshpass: command not found

但是sshpass已经安装并且在直接用于命令行时可以正常工作。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

while read PATH;

PATH是一个特殊变量。来自POSIX shell manual

  

路径

     

按照IEEE Std 1003.1-2001的Base Definitions卷第8章环境变量中所述进行格式化的字符串,用于实现命令解释;请参阅命令搜索和执行。

     

...

     

命令搜索和执行

     

....应该使用PATH环境变量....来搜索该命令。

PATH环境变量指定搜索命令的路径。我的系统PATH上的示例等于:

/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/bin:/sbin:/home/kamil/bin

这些是我的命令所在的路径。这些路径用:分隔。

执行while read PATH时,您用其他字符串覆盖了PATH环境变量,因此找不到您的命令。

更改变量的名称。通常在shell中将导出的变量设置为大写。对于脚本中未导出的变量,通常使用小写字母。还可以将-r选项与read一起使用,以使\的反斜杠不特殊,如果您不想删除行中的前导和尾随空格,请指定IFS=(如果要这样做,请使用unno )。您修复的脚本可能如下所示:

#!/bin/bash
 while read -r server password; do
     while read -r path; do
         sshpass -p "$password" scp * "$server":"$path" </dev/null
     done <./paths.txt  
 done <./serverPass.txt