使用 bash 函数在远程桌面中创建目录

使用 bash 函数在远程桌面中创建目录

我有这个功能可以通过 SSH 连接到远程桌面并在那里执行一些操作,但我无法真正弄清楚语法以及是否可以这样做。

#Simple example
simple () {
ssh $1 "cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/$2; mkdir $var; cd $var; pwd";
}

当我运行上面的脚本时出现错误missing operand Try 'mkdir --help' for more information. /home/ubuntu

我想要做的是连接到远程桌面,创建一个新目录/home/ubuntu/$2,cd 到它并打印它。

PS 抱歉,我忘了提到还会有另一个位置争论。

答案1

整个字符串"cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir $var; cd $var; pwd"在发送到远程主机之前在客户端进行扩展。在客户端环境中,var未设置,导致$var扩展为空字符串,进而导致在远程主机上运行的命令为 mkdirand cd,不带参数。

一个简单的修复方法是用单引号引用字符串,强制在远程主机上进行扩展:

ssh "$1" 'cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir $var; cd $var; pwd'

如果在您的实际用例中,部分字符串需要在客户端扩展,您可以使用双引号并仅保护那些应远程扩展的变量:

ssh "$1" "cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir \$var; cd \$var; pwd"

还有其他方法可以做到这一点;此处文档的各种风格之一可能也适合。

答案2

另一种方法是使用heredoc(包含在我对超级用户问题的回答中):

simple.func () {

    ssh ${1}@${2} <<'EOF'
    cd /home/jbutryn/test
    DIR_VAR='/home/jbutryn/test/tmp'
    mkdir "$DIR_VAR"
    cd "$DIR_VAR"
    pwd
EOF

}

正如 dhag 指出的,我们必须转义本地计算机上的任何变量,以便它们按原样发送到远程计算机并在那里扩展。单引号EOF分隔符可以实现此目的。我还添加了$2主机名/IP 的参数。我不确定你是如何运行该函数的,但现在它是simple.func [user] [hostname]

由于您需要传递本地位置参数,因此您可以这样做:

simple.func () {

    ssh ${1} <<EOF
    cd /home/jbutryn/test
    DIR_VAR="/home/jbutryn/test/${2}"
    mkdir '$DIR_VAR'
    cd '$DIR_VAR'
    pwd
EOF

}

相关内容