This does not return all “config files and install paths” as it only ever considers files that came in the package, not files created by the package (such as /etc/samba.smb.conf, which is created during installation), so doesn’t actually solve the problem.
That limitation should’ve been made clear in the advice itself so as not to send users that don’t know better down dead ends, though the subsequent discussion between this and the previous user is a great illustration of how the way some give Linux “advice” just ends up frustrating those seeking advice.
(It even eventually frustrated me because over the years I’ve had to teach plenty of junior developers to not give advice like that, only they’re seldom so bad that they insist they actually know what the other person wants even in the face of a user providing proof that they do not)
I just tried this with Samba (so dpkg -L samba and dpkg -S samba, and I also tried adding grep"smb.conf" and running it with sudo) and I was unable to find the share config file.
It’s located under /etc/samba/smb.conf but that command was returning a path under my local user. This is on Ubuntu
This is a good argument for shipping an empty config file.
Your point stands, but this also isn’t completely unintuitive. There is pattern there: you installed samba and the config is in /etc/samba/. System level installs will almost always install their config in /etc/ and the sub directory will typically match the name somewhat.
There is likely a general thought that if you’re going to administer a samba server, you’ll also be comfortable with conventions and man pages. Although, funnily enough, in the particular case of samba, man smb.conf doesn’t show the path lol
in the postinit inside the .deb file to create the /etc/samba/smb.conf file. They do it this way so they don’t nuke an already created file. I take back that they should be shipping an empty file, this way is better, but it also means you’ll never be able to query it without some changes to the packaging tools.
The man page should mention the path though that’s a bit lame.
-L, --listfiles package-name...
List files installed to your system from package-name.
-S, --search filename-search-pattern...
Search for a filename from installed packages.
dpkg -S /my/file/path
Finds which, installed, package installed the file.
dpkg -L samba | grep .conf
Greps through the list of files installed by a given package.
If the file you want isn’t in there then it wasn’t installed by the package itself (could be created on the fly by the binary for example), in which case obviously the package system can’t track it.
Oh I see, this command didn’t really do what I wanted it to do then. I just wanted to be able to see the locations of any files associated with a program. If I knew the file path I could just find them haha
Like I said, it obviously can only track files installed by the package, if the conf was generated by the executable after, or if you created it, the package system cannot know about it.
Also, you’re still using -S wrong. It takes a file path as argument, not a package name. And does the opposite of -L by showing you which installed package, if any, owns an existing file.
dpkg -L package-name
Or the inverse
dpkg -S /usr/bin/somefile
For apt based distros, obviously.
This does not return all “config files and install paths” as it only ever considers files that came in the package, not files created by the package (such as /etc/samba.smb.conf, which is created during installation), so doesn’t actually solve the problem.
That limitation should’ve been made clear in the advice itself so as not to send users that don’t know better down dead ends, though the subsequent discussion between this and the previous user is a great illustration of how the way some give Linux “advice” just ends up frustrating those seeking advice.
(It even eventually frustrated me because over the years I’ve had to teach plenty of junior developers to not give advice like that, only they’re seldom so bad that they insist they actually know what the other person wants even in the face of a user providing proof that they do not)
I just tried this with Samba (so
dpkg -L samba
anddpkg -S samba
, and I also tried addinggrep "smb.conf"
and running it with sudo) and I was unable to find the share config file.It’s located under
/etc/samba/smb.conf
but that command was returning a path under my local user. This is on Ubuntudpkg -S
requires a full path like the example I gave.dpkg -L samba
should work fine. What is the error you got?No error or anything, but it just doesn’t have the
/etc/samba/smb.conf
file. Just doesn’t have it.dpkg -S samba
does find/usr/share/samba/smb.conf
which isn’t the right file either.This is a good argument for shipping an empty config file.
Your point stands, but this also isn’t completely unintuitive. There is pattern there: you installed
samba
and the config is in/etc/samba/
. System level installs will almost always install their config in/etc/
and the sub directory will typically match the name somewhat.There is likely a general thought that if you’re going to administer a samba server, you’ll also be comfortable with conventions and man pages. Although, funnily enough, in the particular case of
samba
,man smb.conf
doesn’t show the path lolThat’s the thing though, when you install Samba it does create an empty config file at
\etc\samba\smb.conf
, or at least I’ve never created oneI see why it does this now. Debian does
in the
postinit
inside the.deb
file to create the/etc/samba/smb.conf
file. They do it this way so they don’t nuke an already created file. I take back that they should be shipping an empty file, this way is better, but it also means you’ll never be able to query it without some changes to the packaging tools.The man page should mention the path though that’s a bit lame.
You’re confusing the command again
-L, --listfiles package-name... List files installed to your system from package-name. -S, --search filename-search-pattern... Search for a filename from installed packages.
dpkg -S /my/file/path
Finds which, installed, package installed the file.
dpkg -L samba | grep .conf
Greps through the list of files installed by a given package.
If the file you want isn’t in there then it wasn’t installed by the package itself (could be created on the fly by the binary for example), in which case obviously the package system can’t track it.
Oh I see, this command didn’t really do what I wanted it to do then. I just wanted to be able to see the locations of any files associated with a program. If I knew the file path I could just find them haha
dpkg -L PACKAGE_NAME
does what you want. In my initial reply I mentioned thatdpkg -S
is the inverse.Here is the entire output I get when I get that command.
username@server:~$ dpkg -L samba /usr/share/doc/samba/examples /usr/share/doc/samba/examples/LDAP /usr/share/doc/samba/examples/LDAP/README /usr/share/doc/samba/examples/LDAP/get_next_oid /usr/share/doc/samba/examples/LDAP/ol-schema-migrate.pl /usr/share/doc/samba/examples/LDAP/samba-nds.schema /usr/share/doc/samba/examples/LDAP/samba-schema-FDS.ldif /usr/share/doc/samba/examples/LDAP/samba-schema-netscapeds5.x.README /usr/share/doc/samba/examples/LDAP/samba-schema.IBMSecureWay /usr/share/doc/samba/examples/LDAP/samba.ldif /usr/share/doc/samba/examples/LDAP/samba.schema /usr/share/doc/samba/examples/LDAP/samba.schema.at.IBM-DS /usr/share/doc/samba/examples/LDAP/samba.schema.oc.IBM-DS /usr/share/doc/samba/examples/logon /usr/share/doc/samba/examples/logon/genlogon /usr/share/doc/samba/examples/logon/genlogon/genlogon.pl /usr/share/doc/samba/examples/logon/mklogon /usr/share/doc/samba/examples/logon/mklogon/mklogon.conf /usr/share/doc/samba/examples/logon/mklogon/mklogon.pl /usr/share/doc/samba/examples/logon/ntlogon /usr/share/doc/samba/examples/logon/ntlogon/README /usr/share/doc/samba/examples/logon/ntlogon/ntlogon.conf /usr/share/doc/samba/examples/logon/ntlogon/ntlogon.py /usr/share/doc/samba/examples/printing /usr/share/doc/samba/examples/printing/VampireDriversFunctions /usr/share/doc/samba/examples/printing/prtpub.c /usr/share/doc/samba/examples/printing/readme.prtpub /usr/share/doc/samba/examples/printing/smbprint.sysv /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/samba /usr/share/man /usr/share/man/man1 /usr/share/man/man1/log2pcap.1.gz /usr/share/man/man1/mvxattr.1.gz /usr/share/man/man1/oLschema2ldif.1.gz /usr/share/man/man1/profiles.1.gz /usr/share/man/man1/sharesec.1.gz /usr/share/man/man1/smbcontrol.1.gz /usr/share/man/man1/smbstatus.1.gz /usr/share/man/man8 /usr/share/man/man8/eventlogadm.8.gz /usr/share/man/man8/nmbd.8.gz /usr/share/man/man8/pdbedit.8.gz /usr/share/man/man8/samba-bgqd.8.gz /usr/share/man/man8/samba-gpupdate.8.gz /usr/share/man/man8/samba.8.gz /usr/share/man/man8/samba_downgrade_db.8.gz /usr/share/man/man8/smbd.8.gz /usr/share/samba /usr/share/samba/admx /usr/share/samba/admx/GNOME_Settings.admx /usr/share/samba/admx/en-US /usr/share/samba/admx/en-US/GNOME_Settings.adml /usr/share/samba/admx/en-US/samba.adml /usr/share/samba/admx/ru-RU /usr/share/samba/admx/ru-RU/GNOME_Settings.adml /usr/share/samba/admx/samba.admx /usr/share/samba/mdssvc /usr/share/samba/mdssvc/elasticsearch_mappings.json /usr/share/samba/update-apparmor-samba-profile /var /var/lib /var/lib/samba /var/lib/samba/printers /var/lib/samba/printers/COLOR /var/lib/samba/printers/IA64 /var/lib/samba/printers/W32ALPHA /var/lib/samba/printers/W32MIPS /var/lib/samba/printers/W32PPC /var/lib/samba/printers/W32X86 /var/lib/samba/printers/WIN40 /var/lib/samba/printers/x64 /usr/share/bug/samba/presubj /usr/share/bug/samba/script
Now, if I grep those commands, I get these outputs
username@server:~$ dpkg -S samba | grep "smb.conf" samba-common: /usr/share/samba/smb.conf samba-common: /usr/share/doc/samba-common/examples/smb.conf.default python3-samba: /usr/lib/python3/dist-packages/samba/gp/gp_smb_conf_ext.py
username@server:~$ dpkg -L samba | grep "smb.conf" username@server:~$
And these are copy and pasted straight from my terminal.
Like I said, it obviously can only track files installed by the package, if the conf was generated by the executable after, or if you created it, the package system cannot know about it.
Also, you’re still using
-S
wrong. It takes a file path as argument, not a package name. And does the opposite of-L
by showing you which installed package, if any, owns an existing file.You might want to look into the locate package (it might be called mlocate) if you can’t find a file. It can be helpful.