001    /*
002     * Copyright 2001-2005 The Apache Software Foundation
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.apache.commons.net.bsd;
017    
018    import java.io.IOException;
019    
020    /***
021     * RLoginClient is very similar to
022     * {@link org.apache.commons.net.bsd.RCommandClient},
023     * from which it is derived, and uses the rcmd() facility implemented
024     * in RCommandClient to implement the functionality of the rlogin command that
025     * first appeared in 4.2BSD Unix.  rlogin is a command used to login to
026     * a remote machine from a trusted host, sometimes without issuing a
027     * password.  The trust relationship is the same as described in
028     * the documentation for
029     * {@link org.apache.commons.net.bsd.RCommandClient}.
030     * <p>
031     * As with virtually all of the client classes in org.apache.commons.net, this
032     * class derives from SocketClient.  But it relies on the connection
033     * methods defined  in RcommandClient which ensure that the local Socket
034     * will originate from an acceptable rshell port.  The way to use
035     * RLoginClient is to first connect
036     * to the server, call the {@link #rlogin  rlogin() } method,
037     * and then
038     * fetch the connection's input and output streams.
039     * Interaction with the remote command is controlled entirely through the
040     * I/O streams.  Once you have finished processing the streams, you should
041     * invoke {@link org.apache.commons.net.bsd.RExecClient#disconnect disconnect() }
042     *  to clean up properly.
043     * <p>
044     * The standard output and standard error streams of the
045     * remote process are transmitted over the same connection, readable
046     * from the input stream returned by
047     * {@link org.apache.commons.net.bsd.RExecClient#getInputStream getInputStream() }
048     * .  Unlike RExecClient and RCommandClient, it is
049     * not possible to tell the rlogind daemon to return the standard error
050     * stream over a separate connection.
051     * {@link org.apache.commons.net.bsd.RExecClient#getErrorStream getErrorStream() }
052     *  will always return null.
053     * The standard input of the remote process can be written to through
054     * the output stream returned by
055     * {@link org.apache.commons.net.bsd.RExecClient#getOutputStream getOutputSream() }
056     * .
057     * <p>
058     * <p>
059     * @author Daniel F. Savarese
060     * @see org.apache.commons.net.SocketClient
061     * @see RExecClient
062     * @see RCommandClient
063     ***/
064    
065    public class RLoginClient extends RCommandClient
066    {
067        /***
068         * The default rlogin port.  Set to 513 in BSD Unix and according
069         * to RFC 1282.
070         ***/
071        public static final int DEFAULT_PORT = 513;
072    
073        /***
074         * The default RLoginClient constructor.  Initializes the
075         * default port to <code> DEFAULT_PORT </code>.
076         ***/
077        public RLoginClient()
078        {
079            setDefaultPort(DEFAULT_PORT);
080        }
081    
082    
083        /***
084         * Logins into a remote machine through the rlogind daemon on the server
085         * to which the RLoginClient is connected.  After calling this method,
086         * you may interact with the remote login shell through its standard input
087         * and output streams.  Standard error is sent over the same stream as
088         * standard output.  You will typically be able to detect
089         * the termination of the remote login shell after reaching end of file
090         * on its standard output (accessible through
091         * {@link #getInputStream  getInputStream() }.  Disconnecting
092         * from the server or closing the process streams before reaching
093         * end of file will terminate the remote login shell in most cases.
094         * <p>
095         * If user authentication fails, the rlogind daemon will request that
096         * a password be entered interactively.  You will be able to read the
097         * prompt from the output stream of the RLoginClient and write the
098         * password to the input stream of the RLoginClient.
099         * <p>
100         * @param localUsername  The user account on the local machine that is
101         *        trying to login to the remote host.
102         * @param remoteUsername  The account name on the server that is
103         *        being logged in to.
104         * @param terminalType   The name of the user's terminal (e.g., "vt100",
105         *        "network", etc.)
106         * @param terminalSpeed  The speed of the user's terminal, expressed
107         *        as a baud rate or bps (e.g., 9600 or 38400)
108         * @exception IOException If the rlogin() attempt fails.  The exception
109         *            will contain a message indicating the nature of the failure.
110         ***/
111        public void rlogin(String localUsername, String remoteUsername,
112                           String terminalType, int terminalSpeed)
113        throws IOException
114        {
115            rexec(localUsername, remoteUsername, terminalType + "/" + terminalSpeed,
116                  false);
117        }
118    
119        /***
120         * Same as the other rlogin method, but no terminal speed is defined.
121         ***/
122        public void rlogin(String localUsername, String remoteUsername,
123                           String terminalType)
124        throws IOException
125        {
126            rexec(localUsername, remoteUsername, terminalType, false);
127        }
128    
129    }