Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将命令替换为远程sed命令_Linux_Bash_Unix_Sed_Command Substitution - Fatal编程技术网

Linux 将命令替换为远程sed命令

Linux 将命令替换为远程sed命令,linux,bash,unix,sed,command-substitution,Linux,Bash,Unix,Sed,Command Substitution,我想编写一个Unix命令,从/etc/passwd中选择一个随机用户,并使用SHH检查远程主机以确定是否存在具有相同UID的用户,如果用户存在,则从passwd打印出完整的一行 以下是我到目前为止编写的命令: echo `shuf -n 1 /etc/passwd | cut -d ":" -f 3' | ssh 100.64.0.2 sed -n -e '/**xargs**/p' /etc/passwd 似乎sed命令没有将xargs作为本地计算机的参数,而是一个文本 任何想法都将不胜感

我想编写一个Unix命令,从/etc/passwd中选择一个随机用户,并使用SHH检查远程主机以确定是否存在具有相同UID的用户,如果用户存在,则从passwd打印出完整的一行

以下是我到目前为止编写的命令:

echo `shuf -n 1 /etc/passwd | cut -d ":" -f 3' | ssh 100.64.0.2  sed -n -e '/**xargs**/p' /etc/passwd
似乎sed命令没有将xargs作为本地计算机的参数,而是一个文本

任何想法都将不胜感激

我想你是想写这样的东西

user=$(shuf -n 1 /etc/passwd | cut -d ":" -f 3)
ssh 100.64.0.2  sed -n -e "/$user/p" /etc/passwd
但是,您可能还需要考虑使用getent

正如我在评论OP xargs时所说,它是一个命令。从标准输入中读取一个值并将其粘贴到命令行上并不是什么神奇的事情。请注意,即使作为一个概念,也存在排序问题,因为根据定义,命令行是在任何标准输入可能存在之前构建的

for f in `cat hostlist.txt`; do echo "### $f ###";  ssh $f find / -name "tmp" | sed "s/^/'$f  | '/" ;  done 2>/dev/null

我很难为find命令的每一行打印主机名,这有助于解决问题。

xargs是一个命令,而不是一个表示输入值的神奇字符串。为什么不把整个etc/passwd与本地的进行比较呢?它并不是真的慢,而且更安全ssh 100.64.0.2$shuf-n1您所写的对于一个人来说是多余的,而且会自毁。检查你的逻辑,我帮你修好了=@A.Danischewski您正在将随机系统用户的UID作为命令传递给远程系统。这与用户提出的问题有什么关系,甚至与要做的事情有什么关系?那么我的例子会自毁吗?是的,您当然可以避免使用$user变量,但在这种情况下没有什么理由这样做,并且使用varialbe可以更清楚地区分本地命令和远程命令。当您使用shuf-n1/etc/passwd时,您会从passwd中得到一行,比如mail:x:8:8:mail:/var/mail:/bin/sh,在获得第三个字段(本例中为UID)8之后-在执行ssh并传递getent passwd$user之后-首先需要像ssh 100.64.0.2$getent passwd$user那样编写它,其次,如果使用8传递getent passwd$user,则返回passwd文件中的完整字符串,该文件从mail:x:8:8:mail:/var/mail:/bin/sh开始,这更有意义,但是在第一个ssh中,sed将在任何地方返回匹配项,因此您可能只想将其降级到第三个字段:例如ssh 100.64.0.2 sed-e-n/^[^]*:[^]*:$user:/p/etc/passwd
for f in `cat hostlist.txt`; do echo "### $f ###";  ssh $f find / -name "tmp" | sed "s/^/'$f  | '/" ;  done 2>/dev/null