我正在尝试配置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,
}
答案 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