这是我的脚本
#!/bin/bash
exec < filelist.txt
while read updatedfile oldfile; do
# echo updatedfile = "$updatedfile" #use for troubleshooting
# echo oldfile = "$oldfile" #use for troubleshooting
if [[ ! $updatedfile =~ [^[:space:]] ]] ; then #empty line exception
continue # empty line exception
fi
if [[ ! $oldfile =~ [^[:space:]] ]] ; then #empty line exception
continue # empty line exception
fi
echo Comparing $updatedfile with $oldfile
if diff "$updatedfile" "$oldfile" >/dev/null ; then
echo The files compared are the same. No changes were made.
else
echo The files compared are different.
cp -f -v $oldfile /infanass/dev/admin/backup/`uname -n`_${oldfile##*/}_$(date +%F-%T)
cp -f -v $updatedfile $oldfile
fi
done
#go through rest of servers from list
while read server <&3; do #read server names into the while loop
serverName=$(uname -n)
if [[ ! $server =~ [^[:space:]] ]] ; then #empty line exception
continue
fi
echo server on list = "$server"
echo server signed on = "$serverName"
if [ $serverName == $server ] ; then #makes sure a server doesnt try to ssh to itself
continue
fi
echo "Connecting to - $server"
ssh "$server" #SSH login
exec < filelist.txt
while read updatedfile oldfile; do
# echo updatedfile = $updatedfile #use for troubleshooting
# echo oldfile = $oldfile #use for troubleshooting
if [[ ! $updatedfile =~ [^[:space:]] ]] ; then #empty line exception
continue # empty line exception
fi
if [[ ! $oldfile =~ [^[:space:]] ]] ; then #empty line exception
continue # empty line exception
fi
echo Comparing $updatedfile with $oldfile
if diff "$updatedfile" "$oldfile" >/dev/null ; then
echo The files compared are the same. No changes were made.
else
echo The files compared are different.
cp -f -v $oldfile /infanass/dev/admin/backup/`uname -n`_${oldfile##*/}_$(date +%F-%T)
cp -f -v $updatedfile $oldfile
fi
done
done 3</infanass/dev/admin/servers.txt
当我尝试通过 ssh 连接到我的服务器列表时,出现错误。
Pseudo-terminal will not be allocated because stdin is not a terminal.
然后我的脚本无法正确 ssh 并比较新登录服务器中的文件。有人知道这是为什么吗?
答案1
您是否期望 get 之后的所有命令都ssh "$server"
在 ssh 内运行?事情不是这样的。使用主机名且没有其他参数的 ssh 启动交互式会话。退出后,脚本继续执行下一个命令 ( exec < filelist.txt
)。这不是 ssh 内的远程命令;当命令到达时,ssh 已完成并消失。这只是包含脚本的正常顺序执行。
带有重定向 stdin 的交互式 ssh 会话有些不寻常。这就是您收到警告的原因。 (要消除警告,您可以使用-t
或-T
)
如果你想通过 ssh 连接传递一个大脚本并远程运行它,你可以使用这里的文档, 像这样:
ssh "$server" sh <<EOF
your big script here...
EOF
请务必仔细考虑哪些变量应由本地脚本扩展,哪些变量应在远程脚本执行期间扩展。$
Heredoc 中未受保护的内容将在本地扩展。要保护它,以便远程 shell 看到 a $
,请使用\$
.如果您希望所有这些都受到保护,您可以更改<<EOF
为<<'EOF'
.