为什么gesv(“HOME”)在lsyncd.conf中等于nil?

时间:2017-12-29 13:28:05

标签: linux ubuntu lua lsyncd

我正在尝试配置lsyncd以同步已登录用户主页上的文件夹,但当我尝试使用$HOME捕获其os.getenv("HOME")的值时,结果始终为

  

错误准备/etc/lsyncd/lsyncd.conf.lua:/etc/lsyncd/lsyncd.conf.lua:14:尝试连接一个零值

我尝试了os.getenv("PWD")并且它运行时没有显示错误但是它不起作用而且在/var/log/lsyncd/lsyncd.status文件中我看到它尝试使用/.mozilla/firefox地址,好像PWD是空的。

我尝试通过运行sudo -E service lsyncd restart命令并使用Defaults env_keep +="HOME"修改sudoers来保留环境变量,但都是徒劳的。
有任何想法吗?

我附上我的代码:

settings{
    logfile = "/var/log/lsyncd/lsyncd.log",
    statusFile = "/var/log/lsyncd/lsyncd.status",
}

sync{
        default.rsync,
        source =  os.getenv("HOME").."/.mozilla/firefox/",
        target =  "tmp/.mozilla/firefox/",
        delay  = 1,
}

2 个答案:

答案 0 :(得分:1)

Linux没有“登录用户”的概念。它有 登录用户的概念,但同时可以有很多这样的概念。

您正在通过systemd运行系统服务。告诉sudo保留HOME环境变量意味着当您运行sudo -E service lsyncd restart时,service命令运行时HOME设置为用户的主目录叫sudo。但这与服务的HOME的价值无关。 Systemd没有根据管理命令的环境设置服务环境来启动服务,它们基于服务配置。

如果要同步特定用户的文件,则硬编码该用户主目录的路径,或使用getpwuid  或getpwnam查找用户的主目录。

如果要同步登录用户的文件,请不要使用系统服务。相反,请将lsyncd作为该用户登录会话的一部分运行。

答案 1 :(得分:0)

谢谢吉尔斯的回答。不幸的是,getpwuid和getpwnam返回了" nil"值,相当于null de lua。 我开发的解决方案允许我在多用户和多设备环境中运行lsyncd并与活动目录同步,这样我就可以在活动目录中保存firefox标记,google chrome,svn设置,filezilla,history ...目录并在任何计算机上为任何用户恢复它们。这与使用活动目录和linux的samba方言(cifs)之间的符号链接兼容的问题变得复杂。 我的解决方案如下:(仅通过节省空间用于Firefox,但可以扩展到任何软件或文件夹.config。)

1-我安装lsyncd并在/etc/lsyncd/lsyncd.conf.lua中添加该脚本 (该脚本查找刚刚登录到/ tmp / home文件的用户的主页,并使用它来创建包含要同步的源和目标的URL。)

function file_exists(file)
  local f = io.open(file, "rb")
  if f then f:close() end
  return f ~= nil
end

-- get all lines from a file, returns an empty 
-- list/table if the file does not exist
function lines_from(file)
  if not file_exists(file) then return {} end
  lines = {}
  for line in io.lines(file) do
    lines[#lines + 1] = line
  end
  return lines
end

-- tests the functions above
local file = '/tmp/lua'
local lines = lines_from(file)

-- print all line numbers and their contents
for k,v in pairs(lines) do
  print('line[' .. k .. ']', v)

end
--save line 1 in home
home = lines[1]


settings{

    logfile = "/var/log/lsyncd/lsyncd.log",
    statusFile = "/var/log/lsyncd/lsyncd.status",
}

sync{

        default.rsync,
-- Add home to url of the source
        source =  home.."/.mozilla/firefox/",
--Add home to url of the target
        target =  home.."/box/.mozilla/firefox/",
        delay  = 1,
        rsync={
                perms = true,
                owner = true,


        },
}

2-使用visudo我允许我想要的用户(在我的情况下所有用户)使用sudo命令运行没有密码的lsyncd: ALL ALL = NOPASSWD:SETENV:/ usr / sbin / service lsyncd *

3-我在/ etc / profile文件中添加以下行

//Delete .mozilla in user's local home in start
rm -Rf $HOME/.mozilla
#mkdir -p $HOME/box/.mozilla/Firefox
//Box is the folder shared with the server
mkdir -p $HOME/box/.config
rm -rf $HOME/box/.config/caja
//2> /dev/null prevents an error due to any other cause from being shown to the user and prevents the user from starting up.
cp -rf $HOME/box/.mozilla  $HOME/  2> /dev/null
cp -rf $HOME/box/.config $HOME/ 2> /dev/null
cp -rf $HOME/box/.subversion $HOME/ 2> /dev/null
echo $HOME >> /tmp/lua;
sudo service lsyncd restart; rm -r /tmp/lua