当远程服务器上的ran命令在本地运行时,输出将按预期工作:
desired_kernel_version="5.4.0-105-generic"
cat /tmp/grb.bkp | grep GRUB_DEFAULT
GRUB_DEFAULT=0
kernel_position=$(awk -F\' '$1=="menuentry " || $1=="submenu " {print i++ " : " $2}; /\tmenuentry / {print "\t" i-1">"j++ " : " $2};' /boot/grub/grub.cfg | grep "${desired_kernel_version}" | grep -v recovery | awk '{ print $1}' | sed 's/ //g')
echo $k_position
1>2
sed -i "s/GRUB_DEFAULT=0/GRUB_DEFAULT=\"${k_position}\"/g" /tmp/grb.bkp
cat /tmp/grb.bkp | grep GRUB_DEFAULT
GRUB_DEFAULT="1>2"
从远程服务器运行时所需的输出:将GRUB_DEFAULT值的0替换为引号中的kernel_position。
server=abcd
kernel_position=$(ssh -qT $server awk -F\' '$1=="menuentry " || $1=="submenu " {print i++ " : " $2}; /\tmenuentry / {print "\t" i-1">"j++ " : " $2};' /boot/grub/grub.cfg | grep "${desired_kernel_version}" | grep -v recovery | awk '{ print $1}' | sed 's/ //g')
ssh -qT $server "sed -i "s/GRUB_DEFAULT=0/GRUB_DEFAULT=\"${k_position}\"/g" /tmp/grb.bkp"
发布于 2022-04-01 19:24:50
建议不要引用地狱的话。
通过编写包含所有行的脚本ssh
,将muli行命令发送到remote-script.sh
中。
remote-script.sh
#!/bin/bash
source ~/.bash_profile
$k_position=$1
desired_kernel_version="5.4.0-105-generic"
cat /tmp/grb.bkp | grep GRUB_DEFAULT
GRUB_DEFAULT=0
kernel_position=$(awk -F\' '$1=="menuentry " || $1=="submenu " {print i++ " : " $2}; /\tmenuentry / {print "\t" i-1">"j++ " : " $2};' /boot/grub/grub.cfg | grep "${desired_kernel_version}" | grep -v recovery | awk '{ print $1}' | sed 's/ //g')
echo $k_position
1>2
sed -i "s/GRUB_DEFAULT=0/GRUB_DEFAULT=\"${k_position}\"/g" /tmp/grb.bkp
cat /tmp/grb.bkp | grep GRUB_DEFAULT
GRUB_DEFAULT="1>2"
在remote-script.sh
上授予当前用户执行权限
chmod u+x remote-script.sh
使用scp
命令将remote-script.sh
复制到$server
。如果可能的话,只在部署时进行一次。
scp -q remote-script.sh $server:/home/your-user
使用ssh
命令在远程服务器上运行remote-script.sh
。在命令行中传递$k_position
。
ssh -qT $server "bash -c /home/your-user/remote-script.sh $k_position"
顺便说一句,在计算kernel_position
时,建议将所有awk
、grep
、sed
命令折叠成一个awk
脚本。
https://stackoverflow.com/questions/71710917
复制相似问题