閱讀905 返回首頁    go 京東網上商城


Golang 退出chroot環境的方法

chroot()是用linux的係統函數,能改變程序運行時參考的根目錄。安裝係統或者通過引導盤進入恢複係統時,可以通過chroot()修複GRUB,或者安裝軟件。

Golang的syscall包提供Chroot()方法。

但進入chroot環境後,如何退出呢?目前我就碰到這個需求。翻遍syscall包,也沒看到直接的退出方式。Google後發現,不止我一個人想這麼做。有篇文章 給出了python的hack方案。照貓畫虎,我用go試著做了一遍:


    // hold our real root's file descriptor for switching back later
    oldRootF, err := os.Open("/")
    defer oldRootF.Close()
    if err != nil {
        glog.Warningf("fail to open root: %v\n", err)
    }

    // change working dir to old root
    err = syscall.Chroot("/mnt/install")
    if err != nil {
        glog.Warningf("fail to chroot %v\n", err)
    }

    // do some stuff in new root 

    // switch back
    err = oldRootF.Chdir()
    if err != nil {
        glog.Warningf("chdir() err: %v", err)
    }
    err = syscall.Chroot(".")
    if err != nil {
        glog.Warningf("chroot back err: %v", err)
    }

其中的把戲在於,切根之前先保存舊根的文件FD。等到要切回來時,先把當前工作目錄切回舊的根目錄,再chroot到當前目錄。

最後更新:2017-04-07 21:05:50

  上一篇:go 科技更好玩|混淆你視線的騙子|商之翼新聞
  下一篇:go SQL注入攻擊和防禦