我尝试ssh到多个主机(数千个),捕获一些命令输出并写入文件。但是所有命令的输出应该在同一行,逗号分隔,空格分隔,每个主机的相同行中的任何内容。
所以我的命令就像“:
ssh $host "hostname; uname -r; echo mypassword| sudo -S ipmitool mc info | grep 'Firmware Revision' " > ssh.out
但如果我这样使用,它会将所有命令输出写入单独的行。 (每个主机3行)。但我想要的只是每个主机一行,让我们说:
myserver,3.2.45-0.6.wd.514,4.3 (comma or any field separator is fine)
我怎么能这样做?
答案 0 :(得分:0)
它不是很整洁,但使用printf
有效。 hostname
和uname -r
已经过验证可以使用。我不知道ipmitool
输出是什么,所以我无法验证。
ssh $host "printf $(hostname),$(uname -r),$(echo mypassword| sudo -S ipmitool mc info | grep 'Firmware Revision')\n" > ssh.out
答案 1 :(得分:0)
您可以将ssh
的输出保存到变量中,然后将其打印出来:
ssh_output=$(ssh $host "hostname; uname -r; echo mypassword | sudo -S ipmitool mc info | grep 'Firmware Revision' ")
printf '%s\n' "$ssh_output"
答案 2 :(得分:0)
使用bash Array variables。将每个 while( fgets(buf,sizeof(buf),stdin) ){
printf("%s", buf);
if(strcmp(buf,"\n") == 0){
break;
}
while(write(right_con, buf,sizeof(buf)) < 0) {
printf("Error writing to socket\n");
exit(1);
}
memset(buf,0,sizeof(buf));
}
rc = read(keyboard,buf,sizeof(buf));
命令的输出附加到数组。最后,ssh
数组的所有元素。结果将是所有数组元素在一行上。将IFS
(内部字段分隔符)设置为所需的每个主机分隔符。 (我使用echo
。)为了处理同一ssh会话中多个命令的多行输出,使用tr
用分隔符替换换行符。 (我用了一个空格。)
,
sshoutput=()
for host in host01 host02 host03; do
sshoutput+=($(ssh $host 'echo $(hostname; uname -a; echo mypassword) | tr "\n" " "'))
done
IFS=,; echo "${sshoutput[*]}";