从 Ubuntu 13.04 开始,将某些应用程序列入白名单(并因此列入黑名单)以防止其创建托盘图标的可能性已经消失。从那时起,Java 应用程序的托盘图标和 Wine 图标都是硬编码的,并且始终可见。
尽管某些 ppa 通过返回 systray.whitelist 提供了统一补丁(但目前还不适用于 14.04),但我想知道是否还有其他方法可以隐藏 Java 应用程序的托盘图标(例如 JDownloader)
我知道有一种方法可以为 qt 应用程序实现这一点,即通过实施 apparmor-profiles 来拒绝对 sni-qt 包的读取访问(例如 Skype 或 Spotify)
有没有办法为 Java 应用程序和/或 Wine 应用程序实现 apparmor 配置文件或类似的东西?
谢谢
答案1
对于 Java 应用程序:
实际上,对于 JDownloader 来说,它是一种模块化设计。托盘图标作为插件提供,可以通过以下方式禁用:
JDownloader → 插件 → 插件管理器 → 扩展 → 取消选中启用盒子JD 轻型托盘
对于 Java 应用程序一般情况,可以通过编写自定义策略规则来使用 Java 安全管理器。
创建
java.policy
文件~/.jdownloader
包含:grant codeBase "file:/home/user/.jdownloader/-" { // full access // permission java.security.AllPermission; // AWTPermission full or only selected elements from it // permission java.awt.AWTPermission "*"; permission java.awt.AWTPermission "accessClipboard"; permission java.awt.AWTPermission "accessEventQueue"; // permission java.awt.AWTPermission "accessSystemTray"; permission java.awt.AWTPermission "createRobot"; permission java.awt.AWTPermission "fullScreenExclusive"; permission java.awt.AWTPermission "listenToAllAWTEvents"; permission java.awt.AWTPermission "readDisplayPixels"; permission java.awt.AWTPermission "replaceKeyboardFocusManager"; permission java.awt.AWTPermission "setAppletStub"; permission java.awt.AWTPermission "setWindowAlwaysOnTop"; permission java.awt.AWTPermission "showWindowWithoutWarningBanner"; permission java.awt.AWTPermission "toolkitModality"; permission java.awt.AWTPermission "watchMousePointer"; // Added by try and learn permission java.io.FilePermission "/-", "read,write,delete"; permission java.util.PropertyPermission "*", "read,write"; permission java.util.logging.LoggingPermission "control"; permission java.lang.RuntimePermission "*"; permission java.net.NetPermission "*"; permission java.security.SecurityPermission "*"; permission javax.net.ssl.SSLPermission "*"; permission java.net.SocketPermission "*", "connect,resolve"; permission java.lang.reflect.ReflectPermission "*"; };
修改
jdownloader
启动脚本以使用自定义策略sudo nano /usr/bin/jdownloader
添加:
-Djava.security.manager -Djava.security.policy=java.policy
到java命令调用:exec java ${JAVA_OPTIONS} -Djava.security.manager -Djava.security.policy=java.policy -jar JDownloader.jar $*
这些是允许我启动 jdownloader 的最低规则。您可能需要添加更多权限。因为没有deny
选项,所以您必须编写所有必要的grant
规则。
参考:
java.awt
: 类系统托盘java.awt
: 类 AWTPermission-
看直接已知子类如果您想编写一个授予
AllPermission
except的通用模板accessSystemTray
。那么您可以将它用于所有剩余的 Java 应用程序。
//
顺便说一句,尝试通过在行首添加注释来注释其中一条规则;这样您就可以看到拒绝权限的错误是什么样子的。它会告诉您应该添加哪个权限。还请注意,我已经使用了很多规则-
并*
试图扩展规则,因为我正在寻找一个快速解决方案(AllPermission
无论如何都是默认的),而且我并不想让应用程序坐牢。
这是一个开始的模板,尝试授予所有可能的权限:
grant codeBase "file:/home/user/.jdownloader/-" {
// permission java.security.AllPermission;
// permission java.awt.AWTPermission "*";
permission java.awt.AWTPermission "accessClipboard";
permission java.awt.AWTPermission "accessEventQueue";
// permission java.awt.AWTPermission "accessSystemTray";
permission java.awt.AWTPermission "createRobot";
permission java.awt.AWTPermission "fullScreenExclusive";
permission java.awt.AWTPermission "listenToAllAWTEvents";
permission java.awt.AWTPermission "readDisplayPixels";
permission java.awt.AWTPermission "replaceKeyboardFocusManager";
permission java.awt.AWTPermission "setAppletStub";
permission java.awt.AWTPermission "setWindowAlwaysOnTop";
permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
permission java.awt.AWTPermission "toolkitModality";
permission java.awt.AWTPermission "watchMousePointer";
permission javax.sound.sampled.AudioPermission "*";
permission javax.security.auth.AuthPermission "*";
// permission javax.security.auth.kerberos.DelegationPermission "";
permission javax.xml.bind.JAXBPermission "*";
permission java.nio.file.LinkPermission "hard";
permission java.nio.file.LinkPermission "symbolic";
permission java.util.logging.LoggingPermission "control";
// permission java.lang.management.ManagementPermission "*";
permission javax.management.MBeanServerPermission "*";
permission javax.management.MBeanTrustPermission "*";
permission java.net.NetPermission "*";
permission java.util.PropertyPermission "*", "read,write";
permission java.lang.reflect.ReflectPermission "*";
permission java.lang.RuntimePermission "*";
permission java.security.SecurityPermission "*";
permission java.io.SerializablePermission "*";
permission java.sql.SQLPermission "*";
permission javax.net.ssl.SSLPermission "*";
permission javax.management.remote.SubjectDelegationPermission "*";
permission javax.xml.ws.WebServicePermission "*";
// permission "*";
permission java.io.FilePermission "/-", "read,write,execute,delete,readlink";
permission javax.management.MBeanPermission "*", "*";
// permission javax.security.auth.PrivateCredentialPermission "", "read";
permission javax.security.auth.kerberos.ServicePermission "*", "initiate,accept";
permission java.net.SocketPermission "*", "accept,connect,listen,resolve";
permission java.net.URLPermission "*";
};
笔记:
Java Policy Tools 是一个用于编辑策略文件的 GUI 工具。它使从下拉框中查找所有可用选项变得更加容易。它应该已经随 Java 包一起安装。
答案2
尽管 Sneetsher 的答案很完美,但我发现了一个更简单(且明显)的解决方案。此方法适用于 JDownloader,但也应该适用于所有其他 Java 程序。
只需删除徽标rm ~/.jdownloader/jd/img/logo/jd_logo_128_128.png
,然后使用以下方法创建无效的 png 图标touch ~/.jdownloader/jd/img/logo/jd_logo_128_128.png
使用这种方法,仍然可以使用 TrayIcon 插件(用于最小化到托盘),而不需要丑陋的 Java 图标
答案3
由于我看不到明显更好的解决方案,因此这可能会有所帮助:
你可以把托盘全部扔掉!
- 如果可能的话,禁用它
- 或者用其他可以手动配置的面板替换整个面板,只是不添加托盘元素。(我喜欢
xfce4-panel
这种事情)
如果您现在怀念基于托盘的功能,那么大多数功能应该可以通过某种方式逐一替换,例如在某些事件上显示桌面通知的脚本。
答案4
如果您希望所有使用托盘图标的应用程序都能在 Ubuntu 14.04 中使用它,您可以使用 Unity 补丁附带的 PPA 重新启用系统托盘白名单。为此,请打开终端并运行以下命令:
sudo add-apt-repository ppa:gurqn/systray-trusty
sudo apt-get update
sudo apt-get upgrade
然后,按 ALT + F2 并输入“unity”或注销来重新启动 Unity。PPA 现在会自动将所有应用程序列入白名单,因此无需手动将单个应用程序列入白名单即可使用系统托盘。
恢复更改
如果您想要恢复更改并从 Ubuntu 存储库返回到默认的 Unity 软件包,请使用以下命令清除 Unity 系统托盘白名单 PPA:
sudo apt-get install ppa-purge
sudo ppa-purge ppa:gurqn/systray-trusty
从http://www.webupd8.org/2013/05/how-to-get-systray-whitelist-back-in.html