使用 sshpass 运行命令

使用 sshpass 运行命令

我正在尝试在 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)

相关内容