这是我的脚本,我在这里使用它来列出用户给定路径上的文件,它正在登录服务器但没有列出文件,任何人都可以知道吗?
#! /bin/bash
echo "Please give correct path"
for HOST in $(cat servers.txt ) ; do
ssha $HOST < List.sh
done
猫列表.sh
#!/bin/bash
echo "Enter the path to list the files"
read $path
ls -lrt
答案1
您遇到的问题是您通过标准输入传递脚本,但脚本本身尝试从标准输入读取。为了将参数传递给在标准输入上传递的脚本,我建议使用命令行参数,如果您仍然需要的话,可能会在外部循环中使用从标准输入读取的参数。
您遇到的第二个问题是您的调用语法read
错误。 (它需要一个不带 . 的变量名$
。)此外,您希望传递-r
给read
,否则如果输入包含反斜杠,它会做出令人讨厌且意想不到的事情。
你遇到的第三个问题是你正在做for i in $(cat servers.txt)
,而你却想要<servers.txt while read -r i
。这是按行进行的;该for
循环不仅将整个文件读入内存(使其可能在大文件上爆炸),而且当个别行中有空格时它会失败。
答案2
我认为这里存在几个问题。其中之一是您尝试在远程服务器上的 ssh 会话中提示用户,但由于您通过 stdin 将该脚本重定向到 ssh 会话,因此没有分配终端,用户响应的机会也没有太多。
然后,您正在读取 from stdin
,但这实际上是包含脚本其余部分的流,因此它只是从您希望其执行的行中读取,而不是用户输入。
然后您尝试扩展变量$path
作为要读取的参数,但是您不应该拥有 ,$
因为您只需给它变量的名称,您不必扩展它的名称(与您设置的任何位置一样)一个变量)。
最后,您永远不要尝试在命令中使用该路径ls
。
在这种情况下,在执行脚本之前提示用户可能会更好。就像是:
while read -r host; do
read -p "Enter the path to list the files: " path
ssh $HOST ls -lrt $path
done < servers.txt