ssh 当使用变量形式调用时循环不起作用
ssh when invoked with variables form while loop not working
我 运行 遇到一个问题,我正在比较两个文件(alert.txt 和 env.txt)并根据共同的价值,我从 [=16] 中提取完整的行数据=] 基于匹配条目。我正在将这些值读入 while 循环,然后调用一个函数,如下所示。 ssh 调用不工作,start_admin 中的 while 循环也不工作
#!/bin/bash
start_admin()
{
ssh -n -f $user@$host "sh -c 'cd $domain; ./script.sh > /dev/null 2>&1'"
while !(netstat -na | grep -E $host:$port|grep -E LISTEN) 2>/dev/null
sleep 30
do
echo "waiting"
done
echo "started"
}
grep -Ff alert.txt env.txt | (while IFS=" " read -r r1 r2 r3 r4 r5
do
user=$r2
host=$r3
domain=$r4
port=$r5
done
start_admin $user $host $domain $port
)
and contents of alert.txt is:
env2
env3
and that of env.txt is :
env1 user1 host1 /app/domain1/ port1
env2 user2 host2 /app/domain2/ port2
env3 user3 host3 /app/domain3/ port3
我可以用多个 if else 循环来解决这个问题,但这不是理想的解决方案,请指导我正确的方向,看看缺少什么?
- 此处使用 join 而不是 grep 以避免误报
- 因为你的
while read
循环在你 运行 start_admin
之前完成,你只启动它一次(done
应该在 start_admin
之后)
- 在
start_admin
中,不要使用$user
、$host
等,使用</code>、<code>
(或使用但不使用)调用函数时不要将它们作为参数传递)
我不确定你到底想达到什么目的,但这里已经是修订版了。
#!/bin/bash
start_admin()
{
sanitized_domain=${domain//'"'/'\"'}
ssh -n -f "$user@$host" "sh -c 'cd \"$sanitized_domain\"; ./script.sh >/dev/null 2>&1'"
while ! netstat -na | grep -q " $host:$port .*LISTEN"; do
echo waiting
sleep 30
done
echo started
}
join alert.txt env.txt | while IFS=' ' read -r env user host domain port; do
start_admin
done
)
我 运行 遇到一个问题,我正在比较两个文件(alert.txt 和 env.txt)并根据共同的价值,我从 [=16] 中提取完整的行数据=] 基于匹配条目。我正在将这些值读入 while 循环,然后调用一个函数,如下所示。 ssh 调用不工作,start_admin 中的 while 循环也不工作
#!/bin/bash
start_admin()
{
ssh -n -f $user@$host "sh -c 'cd $domain; ./script.sh > /dev/null 2>&1'"
while !(netstat -na | grep -E $host:$port|grep -E LISTEN) 2>/dev/null
sleep 30
do
echo "waiting"
done
echo "started"
}
grep -Ff alert.txt env.txt | (while IFS=" " read -r r1 r2 r3 r4 r5
do
user=$r2
host=$r3
domain=$r4
port=$r5
done
start_admin $user $host $domain $port
)
and contents of alert.txt is:
env2
env3
and that of env.txt is :
env1 user1 host1 /app/domain1/ port1
env2 user2 host2 /app/domain2/ port2
env3 user3 host3 /app/domain3/ port3
我可以用多个 if else 循环来解决这个问题,但这不是理想的解决方案,请指导我正确的方向,看看缺少什么?
- 此处使用 join 而不是 grep 以避免误报
- 因为你的
while read
循环在你 运行start_admin
之前完成,你只启动它一次(done
应该在start_admin
之后) - 在
start_admin
中,不要使用$user
、$host
等,使用</code>、<code>
(或使用但不使用)调用函数时不要将它们作为参数传递)
我不确定你到底想达到什么目的,但这里已经是修订版了。
#!/bin/bash
start_admin()
{
sanitized_domain=${domain//'"'/'\"'}
ssh -n -f "$user@$host" "sh -c 'cd \"$sanitized_domain\"; ./script.sh >/dev/null 2>&1'"
while ! netstat -na | grep -q " $host:$port .*LISTEN"; do
echo waiting
sleep 30
done
echo started
}
join alert.txt env.txt | while IFS=' ' read -r env user host domain port; do
start_admin
done
)