我想squid.conf从一台服务器复制到另一台服务器。
600权限并且归 root 所有。PermitRootLogin no)。我知道要做
ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
ssh target 'tar xzpf - -C /etc/squid/'
Run Code Online (Sandbox Code Playgroud)
在服务器之间复制文件并保留权限。但是,在这种情况下,我将收到“权限被拒绝”。
我也知道我可以这样做:
ssh -t source 'sudo cat /etc/squid/squid.conf'
Run Code Online (Sandbox Code Playgroud)
这种方式-t允许 sudo 在输出文件内容之前询问管理员密码。
问题是,我不知道如何将这些技术组合成在每台服务器上要求 sudo 密码的东西,并将文件传输到其目的地。这可能吗?
更新:这是我能想到的最好的:
ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
ssh target 'cat >/tmp/squid.tgz' && \ …Run Code Online (Sandbox Code Playgroud) 在 bash 中,一个命令链接
echo test > actual.txt
Run Code Online (Sandbox Code Playgroud)
将替换actual.txt用“test”调用的文件的内容,如果文件不存在则创建该文件。但是,如果文件确实存在,bash 只会打开它,截断它,然后将新内容写入文件。
具体来说,重定向命令在这种情况下会失败:
ln -s /some/illegal/path link.txt
echo test > link.txt
Run Code Online (Sandbox Code Playgroud)
Bash 4.4.12 给了我令人困惑的错误信息link.txt: No such file or directory。
避免这种情况的一种方法是确保在运行重定向命令之前删除文件。
rm link.txt && echo test > link.txt
Run Code Online (Sandbox Code Playgroud)
不过,我想知道是否对 bash 选项或重定向运算符进行了一些调整,以防止这种失败模式。有任何想法吗?
考虑以下脚本1:
#!/bin/bash
bash <<END
printf "%s\n" "$@"
END
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是(对我来说),$@这里文档的内部首先被扩展,然后被引用,所以这是输出:
$ /tmp/test.sh "a a" b c
a a b c
Run Code Online (Sandbox Code Playgroud)
如果我删除引号,我会得到简单的$@行为:
$ /tmp/test.sh "a a" b c
a
a
b
c
Run Code Online (Sandbox Code Playgroud)
这两个选项都无法提供所需的输出。我尝试使用类似 的数组args=("$@"),但扩展的行为方式相同。我尝试将“结果”放入诸如 之类的变量中args="$@",但这只会返回“aab c”。
有什么想法如何使输出如下所示?
a a
b
c
Run Code Online (Sandbox Code Playgroud)
1显然,这是非常简单的。实际上,我正在使用heredoc来执行脚本docker run,但这对这个问题来说并不重要。