我有这个功能可以通过 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
扩展为空字符串,进而导致在远程主机上运行的命令为
mkdir
and 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
}