这里有几个建议:
- 你可以在你的shell脚本总是回声线,看看发生了什么事情。
- 您还可以使用
set -xv
来帮助您调试shell脚本。只需在想要调试的部分之前放置set -xv
,然后set +xv
即可关闭调试。您还可以使用export PS4="\$LINENO> "
在shell脚本中输出行号。
下面是您的脚本将如何与set -xv
一起看。这是一个非常好的调试shell脚本的工具。使用方法:
export PS4="\$LINENO: "
set -xv
for ip1 in $IP1
do
sshpass -fpass1.txt scp -r [email protected]$IP1:/attach/res* /user/path/to/$DIR1/
done
for ip2 in $IP2
do
sshpass -fpass2.txt scp -r [email protected]$IP2:/attach/res* /user/path/to/$DIR2/
done
set +xv
我只是做了sshpass
命令echo语句,因为该计划将不是我的系统上运行反正。这是我的输出echo
。这是您尝试执行的命令:
sshpass -fpass1.txt scp -r [email protected] 2.2.2.2 3.3.3.3 4.4.4.4:/attach/res* /user/path/to/1 2 3 4/
sshpass -fpass1.txt scp -r [email protected] 2.2.2.2 3.3.3.3 4.4.4.4:/attach/res* /user/path/to/1 2 3 4/
sshpass -fpass1.txt scp -r [email protected] 2.2.2.2 3.3.3.3 4.4.4.4:/attach/res* /user/path/to/1 2 3 4/
sshpass -fpass1.txt scp -r [email protected] 2.2.2.2 3.3.3.3 4.4.4.4:/attach/res* /user/path/to/1 2 3 4/
sshpass -fpass2.txt scp -r [email protected] 6.6.6.6 6.6.6.6 7.7.7.7:/attach/res* /user/path/to/5 100 104 135/
sshpass -fpass2.txt scp -r [email protected] 6.6.6.6 6.6.6.6 7.7.7.7:/attach/res* /user/path/to/5 100 104 135/
sshpass -fpass2.txt scp -r [email protected] 6.6.6.6 6.6.6.6 7.7.7.7:/attach/res* /user/path/to/5 100 104 135/
sshpass -fpass2.txt scp -r [email protected] 6.6.6.6 6.6.6.6 7.7.7.7:/attach/res* /user/path/to/5 100 104 135/
首先,该IP地址全错了。你注意到你似乎被循环,因为该命令正在执行的次数你期望,但你在命令中的IP地址使用错误的变量。您有:
sshpass -fpass1.txt scp -r [email protected]$IP1:/attach/res* /user/path/to/$DIR1/
^^^^
,而不是:
sshpass -fpass1.txt scp -r [email protected]$ip1:/attach/res* /user/path/to/$DIR1/
^^^^
注意$ip1
是你的循环变量,$IP1
是包含所有IP地址的变量。 不要通过大小写不同的名称来调用变量!。如果你给了他们不同的名字,会更好。例如$ip_list1
而不是$IP1
和$ip
代替$ip1
:
ip_list1="..."
for ip in $ip_list`
do
sshpass -fpass1.txt scp -r [email protected]$ip:/attach/res* /user/path/to/$DIR1/
done
修正这个问题,我得到:
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/1
2
3
4/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/1
2
3
4/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/1
2
3
4/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/1
2
3
4/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/5
100
104
135/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/5
100
104
135/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/5
100
104
135/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/5
100
104
135/
现在看这个问题?你是目录,你是scping
是不正确的。它看起来像你想发送你的文件到多个目录,并假设scp
命令将自行循环。
这是我的程序版本。我添加了一个内部循环都要经过每一个目录为每个IP地址:
#!/bin/bash
ip_list1="1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4"
ip_list2="5.5.5.5 6.6.6.6 6.6.6.6 7.7.7.7"
dir_list1="1 2 3 4"
dir_list2="5 100 104 135"
for ip in $ip_list1
do
for dir in $dir_list1
do
echo "sshpass -fpass1.txt scp -r [email protected]$ip:/attach/res* /user/path/to/$dir/"
done
done
for ip in $ip_list2
do
for dir in $dir_list2
do
echo "sshpass -fpass2.txt scp -r [email protected]$ip:/attach/res* /user/path/to/$dir/"
done
done
你并不需要设置多条线路上的IP列表和目录列表,因为for
会打破白色空间的变量。这既是祝福也是诅咒。或者,如果你不小心,最好可能会让你咒骂。你必须确保没有意外的空白。
输出现在是一个比较合理的:
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/1/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/2/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/3/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/4/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/1/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/2/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/3/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/4/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/1/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/2/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/3/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/4/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/1/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/2/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/3/
sshpass -fpass1.txt scp -r [email protected]:/attach/res* /user/path/to/4/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/5/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/100/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/104/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/135/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/5/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/100/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/104/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/135/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/5/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/100/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/104/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/135/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/5/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/100/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/104/
sshpass -fpass2.txt scp -r [email protected]:/attach/res* /user/path/to/135/
取出echo
,它现在应该工作。
任何使用'ssh-copy-id'大量部署密钥的机会,然后定期用普通的scp复制? – cnicutar
我不明白......你可以用这种方式改变我的剧本吗? – MLSC
阅读openssh公钥,然后搜索'ssh-copy-id'。它会变得很明显:-) – cnicutar