【问题标题】:Move/copy files/folder in linux/solaris using only bash built-ins仅使用 bash 内置程序在 linux/solaris 中移动/复制文件/文件夹
【发布时间】:2010-04-07 18:49:25
【问题描述】:

有一种情况,有人将整个根目录移动到远程系统上的子目录中,因此所有系统工具(如 cp、mv 等)都不再工作了。虽然我们有一个活动会话,但无法找到仅使用 bash 内置函数来复制/移动文件的方法。

有人知道实现这一目标的方法吗?

我什至想过用

复制当前目录中的 cp 或 mv 二进制文件
while read -r; do echo $LINE; done

然后将其重定向到一个文件,但它不起作用。猜测是因为二进制文件中的所有特殊不可打印字符都无法使用 echo 复制/显示。

谢谢。

【问题讨论】:

  • 即使这样有效,您将如何chmod +x 复制? :-(

标签: linux bash solaris


【解决方案1】:
/newroot/lib/ld-linux.so.2 --library-path /newroot/lib \
    /newroot/bin/mv /newroot/* /

(与 Solaris 类似,但我认为动态链接器命名为 ld.so.1 或类似的名称。)

或者,如果你的 shell 是 sh-like(不是 csh-like),

LD_LIBRARY_PATH=/newroot/lib /newroot/bin/mv /newroot/* /

【讨论】:

【解决方案2】:

如果您已经准备好预装了sash,那么它是静态的并且具有内置副本 (-cp)。

否则LD_LIBRARY_PATH=/copied/to/path/lib /copied/to/path/bin/cp 可能有用吗?

我认为在预期的位置没有 ld-so 可能有问题。

【讨论】:

  • 正确,ld-so 地方是个问题。
【解决方案3】:

这里是 cp 的合理替代品。如果文件以新行结尾(如大多数文本文件),则需要 echo -E,如果不是(如大多数二进制文件),则需要 echo -nE

echo -nE "`< in.file`" > out.file

【讨论】:

  • 这会跳过(至少)值为 0x00 的字节。有关您必须使用的诡计的示例,请参阅my answer here,其中我展示了一个完全使用 Bash 内置函数编写的 hexdump 版本。然后,正如ehemient所说:“你会如何chmod +x复制?”
【解决方案4】:

旧线程,但犯了完全相同的愚蠢错误。 /lib64 被远程移动到 /lib64.bak,一切都停止了。

这是一个 x86_64 安装,所以 ehemient 的解决方案不起作用:

# /lib64.bak/ld-linux.so.2 --library-path /lib64.bak/ /bin/mv /lib64.bak/ /lib64
/bin/mv: error while loading shared libraries: /bin/mv: wrong ELF class: ELFCLASS64

在这种情况下,必须使用不同的 ld-linux:

# /lib64.bak/ld-linux-x86-64.so.2 --library-path /lib64.bak/ /bin/mv /lib64.bak/ /lib64

现在系统已恢复。谢谢ehemient!

【讨论】:

    【解决方案5】:
    /subdir/bin/mv /subdir /
    

    还是我在你的解释中遗漏了什么?

    【讨论】:

    • 如果/bin/mv 是动态链接的(现在很常见),如果/lib 也被移动,它将不会加载。
    • 是的,是动态链接的。
    【解决方案6】:

    如果您可以访问另一台机器,一个解决方案是下载并编译Busybox 二进制文件。它将是一个包含恢复系统所需的大部分常用工具的单个二进制文件。但是,如果您的系统是远程的,这可能不起作用。

    【讨论】:

    • 是的,我们试图寻找类似的东西。想下载 SUNWsutl 包,但找不到。但即便如此,我们怎么能上传到系统呢?
    • 在远程机器 (nmap) 上打开的任何服务可以用来获取二进制文件吗? Douglas 的 LD_LIBRARY_PATH 建议对基本命令没有帮助吗?
    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2021-12-26
    相关资源
    最近更新 更多