我正在尝试在 bash 脚本中使用 sshpass 向另一台 linux 服务器运行命令。
kernel_ipv4=1.2.3.4
vmpassword=dfbvndfbnpdp
sshpass -p "$vmpassword" ssh -o "StrictHostKeyChecking=no" root@$kernel_ipv4 'apt update && apt upgrade -y && \
apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev -y && \
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-$kernel_version.tar.xz && \
unxz -v /root/linux-$kernel_version.tar.xz && \
tar xvf /root/linux-$kernel_version.tar && \
cp -v /boot/config-$(uname -r) /root/linux-${kernel_version}/.config'
这里的问题是,当我将所有命令放在单引号中时,变量 ${kernel_version} 的值不会被传递。当我将所有命令放在双引号中时,变量的值将(uname -r)
取自当前服务器。
答案1
那么双引号呢?
kernel_ipv4=1.2.3.4
vmpassword=dfbvndfbnpdp
sshpass -p "$vmpassword" ssh -o "StrictHostKeyChecking=no" root@$kernel_ipv4 "apt update && apt upgrade -y && \
apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev -y && \
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-\$kernel_version.tar.xz && \
unxz -v /root/linux-\$kernel_version.tar.xz && \
tar xvf /root/linux-\$kernel_version.tar && \
cp -v /boot/config-\$(uname -r) /root/linux-\${kernel_version}/.config"
由于您有很多命令,我会使用脚本
kernel_ipv4=1.2.3.4
vmpassword=dfbvndfbnpdp
sshpass -p "$vmpassword" ssh -o "StrictHostKeyChecking=no" root@$kernel_ipv4 'bash -s' < update_script
答案2
您可以在适当的地方使用不同的引用:
sshpass -p "$vmpassword" ssh -o "StrictHostKeyChecking=no" root@$kernel_ipv4 "apt update && apt upgrade -y && \
apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev -y && \
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-$kernel_version.tar.xz && \
unxz -v /root/linux-$kernel_version.tar.xz && \
tar xvf /root/linux-$kernel_version.tar && \
cp -v /boot/config-"'$(uname -r)'" /root/linux-${kernel_version}/.config"
或者甚至,只需使用双引号并在前面加上反斜杠 ( \
) $(uname -r)
。