将 ssh 输出重定向到文件更改行结尾

Ena*_*nak 4 shell ssh newlines

首先,如果我做一个简单的,ssh admin@example.com "cat backup.tar" > backup.tar这不会发生!所以,还有其他我不知道的转换它。

我需要提供系统当前状态的备份而不授予对服务器的访问权限。我所做的是以下内容:

  1. 创建一个新用户。我们叫他username
  2. 只允许通过 ssh-key 访问
  3. 将钥匙放入 authorized-keys
  4. 将命令/外壳更改/etc/passwd为自定义脚本username
  5. 自定义脚本通过执行数据库转储和复制一些文件来获取数据,并最终创建一个 tar 存档到 stdout
  6. 确保没有额外的输出到stdout.

为了得到你需要做的的数据:ssh username@example.com > backup.tar

现在,除了行尾被更改外,几乎一切正常。将tar越来越大,我可以看到,每行有DOS行与结束^M的象征。如果我强制dos2unix使用二进制 tar 文件,该文件与服务器上的文件匹配。

为什么会发生这种情况,是什么改变了行尾?我什至将其简化为以下内容:使用上述命令登录并将输出重定向到本地计算机上的文件时,服务器上用于username链接的脚本/etc/passwd只是 make acat .viminfo并且行尾仍然传输错误。sshusername

fra*_*san 5

可能发生的情况:当ssh在没有命令参数(并且没有RemoteCommand指定选项)的情况下调用时,默认情况下在远程系统上为会话分配了一个伪终端。无论远程系统配置为运行什么命令,都会发生这种情况。伪终端通常配置为将换行符转换为回车 + 换行序列(LF? CRLF,请参阅此答案以获取详细说明)。因此,您的脚本的输出被写入一个伪终端设备,它会改变它,然后发送到客户端。

可以通过多种方式防止分配伪终端,包括:

  • 调用ssh-T在客户端选项(或使用RequestTTY nossh的配置文件(可能~/.ssh/config));

  • 在远程系统上的no-pty 用户输入之前添加(注意空格)authorized_keys

  • PermitTTY no在远程系统上的 SSH 服务器配置中使用(可能/etc/ssh/sshd_config),可能使用Match条件块使其仅影响特定用户);例如:

    Match User="username"
      ForceCommand /path/to/your/script
      DisableForwarding yes
      PermitTTY no
    
    Run Code Online (Sandbox Code Playgroud)

    (假设为 中的用户设置了工作命令解释器/etc/passwd;然后您可能想要锁定用户的密码并确保他们没有其他登录方式);

  • (在您的情况下,ssh使用命令参数调用也应该起作用(例如ssh user@host :);尽管我认为这不过是一种解决方法)。

当然,最合适的选项取决于您的用例,尤其取决于是否应该允许用户进行选择。

也可以看看: